import tkinter as tk
from tkinter import ttk
from openpyxl import Workbook
import subprocess
from ttkthemes import ThemedStyle
from datetime import datetime
from openpyxl.styles import Font, Alignment
# Sabit ürün listesi
sabit_urunler = [
"Marul", "Domates", "Nane", "Roka", "Maydanoz", "Lavaş", "Çiğ Köfte", "Kaşar",
"Chedar", "Noddle", "Salatalık Turşu", "Mor Lahana", "Jalepone", "Havuç",
]
# Boş bir gider listesi oluşturalım
gider_listesi = []
def excel_kaydet():
wb = Workbook()
dosya_ad = dosya_adi_entry.get()
# Güncel tarihi al
tarih = datetime.now().strftime("%Y-%m-%d")
dosya_ad = dosya_ad if dosya_ad.endswith('.xlsx') else dosya_ad + '.xlsx'
dosya_ad = tarih + '_' + dosya_ad # Tarihi dosya adının başına ekleyin
# Excel dosyasına giderleri yaz
ws = wb.active
ws.title = "Giderler"
bold_font = Font(bold=True)
centered_alignment = Alignment(horizontal='center')
# Başlık hücrelerini oluşturun ve stil uygulayın
ws['A1'] = "Gider Adı"
ws['A1'].font = bold_font
ws['A1'].alignment = centered_alignment
ws['B1'] = "Gider Miktarı (TL)"
ws['B1'].font = bold_font
ws['B1'].alignment = centered_alignment
row = 2
for gider in gider_listesi:
gider_adi, gider_miktar = gider
ws.cell(row, 1, gider_adi)
ws.cell(row, 2, gider_miktar)
# Hücre hizalamalarını ayarlayın
ws.cell(row, 1).alignment = centered_alignment
ws.cell(row, 2).alignment = centered_alignment
row += 1
# Toplam Gider hücresini ekleyin ve stil uygulayın
ws.cell(row, 1, "Toplam Gider")
ws.cell(row, 1).font = bold_font
ws.cell(row, 2, f'=SUM(B2:B{row - 1})')
ws.cell(row, 2).font = bold_font
ws.cell(row, 2).number_format = '#,##0.00'
# Excel dosyasını kaydet
wb.save(dosya_ad)
dosya_adi_entry.delete(0, tk.END)
print("Giderler başarıyla Excel dosyasına kaydedildi!")
# Gider eklemek için bir fonksiyon oluşturalım
def gider_ekle():
gider_adi = gider_adi_entry.get()
gider_miktar = gider_miktar_entry.get()
# Gider fiyatına yalnızca rakam kabul et
if not is_valid_amount(gider_miktar):
print("Hata: Geçersiz gider miktarı!")
return
gider_listesi.append((gider_adi, float(gider_miktar)) ) # Girdiyi sayıya dönüştür
gider_adi_entry.delete(0, tk.END)
gider_miktar_entry.delete(0, tk.END)
guncelle_giderler()
def urun_sec(event):
selected_item = urun_listbox.get(tk.ACTIVE)
gider_adi_entry.delete(0, tk.END)
gider_adi_entry.insert(0, selected_item)
# Ürün ekleme fonksiyonu
def urun_ekle():
secilen_urun = urun_listbox.get(tk.ACTIVE)
gider_ekle()
gider_adi_entry.insert(tk.END, secilen_urun)
# Giderleri göstermek için bir fonksiyon oluşturalım
def guncelle_giderler():
giderler_listbox.delete(0, tk.END)
toplam_gider = 0
for gider in gider_listesi:
gider_adi, gider_miktar = gider
giderler_listbox.insert(tk.END, f"{gider_adi}: {gider_miktar:.2f} TL")
toplam_gider += gider_miktar
toplam_gider_label.config(text=f"Toplam Gider: {toplam_gider:.2f} TL")
# Gider silme fonksiyonu
def gider_sil():
secilen_index = giderler_listbox.curselection()
if secilen_index:
gider_index = secilen_index[0]
gider_listesi.pop(int(gider_index))
guncelle_giderler()
# Ekran klavyesi işlevi
def ac_ekran_klavyesi():
try:
subprocess.Popen("osk.exe") # Windows'un kendi ekran klavyesi uygulamasını çalıştırır
except Exception as e:
print("Hata: Ekran klavyesi başlatılamadı. Yönetici izni gerekebilir.")
# Gider miktarı için geçerliliği kontrol etme işlevi
def is_valid_amount(amount):
try:
float(amount)
return True
except ValueError:
return False
# Ana uygulama penceresini oluşturalım
uygulama = tk.Tk()
uygulama.title("Gider Takip Programı")
uygulama.geometry("1280x1024") # Pencere boyutunu ayarla
# Temayı oluşturun ve arka plan rengini ayarlayın
style = ThemedStyle(uygulama)
style.set_theme("itft1") # itft1 teması
# Butonları daha büyük yapın ve yazıları kısaltın
style.configure("TButton", font=("Arial", 15)) # Font boyutunu ayarlayın
# Özelleştirilmiş bir stil ile butonları daha geniş hale getirin
stil = ThemedStyle(uygulama)
stil.configure("Genis.TButton", padding=20) # Genişliği artırın
# Sağ tarafta ürün listesi ve kaydırma çubuğu
frame = ttk.Frame(uygulama)
frame.place(x=900, y=0, width=300, height=800) # Sağ tarafta yerleşimi ve genişliği değiştirin
urun_listbox = tk.Listbox(frame, height=len(sabit_urunler), width=35, font=("Arial", 25), selectmode=tk.SINGLE)
scrollbar = ttk.Scrollbar(frame, orient="vertical", command=urun_listbox.yview)
scrollbar.pack(side="right", fill="y")
urun_listbox.config(yscrollcommand=scrollbar.set)
for urun in sabit_urunler:
urun_listbox.insert(tk.END, urun)
urun_listbox.pack()
# Ortadan dikey bir çizgi çiz
cizgi = tk.Canvas(uygulama, width=5, height=800)
cizgi.create_line(5, 0, 5, 800, fill="black")
cizgi.place(x=1200, y=0)
# Gider adı giriş kutusu (sol tarafta)
gider_adi_label = ttk.Label(uygulama, text="Gider Adı:", font=("Arial", 20))
gider_adi_label.place(x=50, y=50)
gider_adi_entry = tk.Entry(uygulama, font=("Arial", 20))
gider_adi_entry.place(x=350, y=50, width=500)
# Gider miktarı giriş kutusu (sol tarafta)
gider_miktar_label = ttk.Label(uygulama, text="Gider Miktarı (TL):", font=("Arial", 20))
gider_miktar_label.place(x=50, y=150)
gider_miktar_entry = tk.Entry(uygulama, font=("Arial", 20))
gider_miktar_entry.place(x=350, y=150, width=500)
def validate_amount_input(P):
if is_valid_amount(P) or P == "":
return True
return False
gider_miktar_entry.config(validate="key", validatecommand=(validate_amount_input, "%P"))
# Gider ekleme düğmesi (sol tarafta)
ekle_dugme = ttk.Button(uygulama, text="Gider Ekle", style="TButton", command=gider_ekle)
ekle_dugme.place(x=50, y=250, width=800)
# Gider silme düğmesi (sol tarafta)
sil_dugme = ttk.Button(uygulama, text="Gider Sil", style="TButton", command=gider_sil)
sil_dugme.place(x=50, y=300, width=800)
# Giderlerin görüntülendiği liste kutusu (sol tarafta) ve kaydırma çubuğu
giderler_frame = ttk.Frame(uygulama)
giderler_frame.place(x=50, y=350, width=800, height=400)
giderler_listbox = tk.Listbox(giderler_frame, font=("Arial", 20), selectmode=tk.SINGLE)
giderler_listbox.pack(fill="both", expand=True, side="left")
scrollbar = ttk.Scrollbar(giderler_frame, orient="vertical", command=giderler_listbox.yview)
scrollbar.pack(side="right", fill="y")
giderler_listbox.config(yscrollcommand=scrollbar.set)
# Toplam gider label (sol tarafta)
toplam_gider_label = ttk.Label(uygulama, text="", font=("Arial", 20), foreground="red")
toplam_gider_label.place(x=50, y=750)
# Excel dosyası adı giriş kutusu (sol tarafta)
dosya_adi_label = ttk.Label(uygulama, text="Excel Dosyası Adı:", font=("Arial", 20))
dosya_adi_label.place(x=50, y=800)
dosya_adi_entry = tk.Entry(uygulama, font=("Arial", 20))
dosya_adi_entry.place(x=350, y=800, width=500)
# Otomatik olarak dosya adı girdi kutusuna güncel tarih ekleyin
def otomatik_tarih_ekle():
tarih = datetime.now().strftime("%Y-%m-%d")
dosya_adi_entry.delete(0, tk.END)
dosya_adi_entry.insert(0, f"Giderler.xlsx")
otomatik_tarih_ekle() # Program başladığında otomatik olarak tarih ekleyin
# Excel'e kaydet düğmesi (sol tarafta)
kaydet_dugme = ttk.Button(uygulama, text="Excel'e Kaydet", style="TButton", command=excel_kaydet)
kaydet_dugme.place(x=50, y=850, width=800)
# Ekran klavyesi butonu (sol tarafta)
klavye_buton = ttk.Button(uygulama, text="Ekran Klavyesi", style="TButton", command=ac_ekran_klavyesi)
klavye_buton.place(x=50, y=900, width=800)
# Ürün listbox'ına çift tıklamayı bağla
urun_listbox.bind('<Double-1>', urun_sec)
# Programı başlat
guncelle_giderler()
uygulama.mainloop()