Ufak bir işletmede excel kullanmayı bilmeyen bir abimiz için chatgpt de yaptırdığım program aktif kullanılıyor böyle bir ihtiyacı olan çıkarsa ücretsiz kullansın diye paylaşıyorum iyi forumlar

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()