Günlük harcamaları kayıt edebileceğiniz bir program

Belki birine hem kullanması lazım olur hem de içindeki kodlardan fayda sağlanması için paylaşıyorum. Benim pythonla alakam iş yada okul ile ilgili değil hobi amaçlı uğraşıyorum. Eksik yada yanlış bulduğunuz yerler olabilir görüş ve düşüncelerinizi yazınız. Database sınıfını direkt ben yazmadım baktığım videolardan örnek alarak oluşturuldu. Zaten sınıf ve fonksiyonlarla aram da iyi değil.

from tkinter import *
from tkinter import ttk
import locale
from tkinter import messagebox
import sqlite3
import os


root = Tk()
root.geometry("1000x550+100+100")
root.title("Masraf Kayıt Sistemi")

locale.setlocale(locale.LC_ALL, 'Turkish_Turkey.1254')

if os.path.exists(os.path.expanduser("~")+"\\pythonpro"):
    path = os.path.expanduser("~")+"\\pythonpro\\"
    print("dizin vardı, işlem yapılmadı", path)

else:
    os.makedirs(os.path.expanduser("~")+"\\pythonpro")
    path = os.path.expanduser("~")+"\\pythonpro\\"
    print("dizin yoktu, oluşturuldu", path)
'# ========================================== VERİ TABANI İŞLEMLERİ =========================================='


class Database:
    def __init__(self, db):
        self.conn = sqlite3.connect(db)
        self.cur = self.conn.cursor()
        self.cur.execute("""CREATE TABLE IF NOT EXISTS gunlukisler (id INTEGER PRIMARY KEY, tarih TEXT, evrak TEXT,
        gider TEXT, firma TEXT, aciklama TEXT, tutar INTEGER)""")
        self.conn.commit()

    def veriler(self):
        self.cur.execute("SELECT * FROM gunlukisler")
        tumveri = self.cur.fetchall()
        return tumveri

    def veriara_gider(self, gider):
        self.cur.execute("SELECT * FROM gunlukisler WHERE gider like ?", (gider,))
        sonuc = self.cur.fetchall()
        return sonuc

    def veriara_firma(self, firma):
        self.cur.execute("SELECT * FROM gunlukisler WHERE firma like ?", (firma,))
        sonuc = self.cur.fetchall()
        return sonuc

    def veriara_aciklama(self, aciklama):
        self.cur.execute("SELECT * FROM gunlukisler WHERE aciklama like ?", (aciklama,))
        sonuc = self.cur.fetchall()
        return sonuc

    def verigirisi(self, tarih, evrak, gider, firma, aciklama, tutar):
        sorgu = "INSERT INTO gunlukisler VALUES (NULL,?,?,?,?,?,?)"
        degerler = (tarih, evrak, gider, firma, aciklama, tutar)
        self.cur.execute(sorgu, degerler)
        self.conn.commit()

    def verisil(self, id):
        self.cur.execute("DELETE FROM gunlukisler WHERE id=?", (id, ))
        self.conn.commit()

    def veriguncelle(self, id, tarih, evrak, gider, firma, aciklama, tutar):
        degerler = (tarih, evrak, gider, firma, aciklama, tutar, id)
        sorgu = "UPDATE gunlukisler SET tarih=?, evrak=?, gider=?, firma=?, aciklama=?, tutar=? WHERE id=?"
        self.cur.execute(sorgu, degerler)
        self.conn.commit()

    def __del__(self):
        self.conn.close()


db = Database(path+"veritabani.db")

'#==================================BUTON FONKSİYONLARI ========================================================'
sayac = 0


def kaydet():
    if ent_tarih.get() == "" or ent_aciklama.get() == "":
        messagebox.showerror(title="Boş Alan Hatası", message="Tarih ve Açıklama kısmı boş olamaz")
    else:
        db.verigirisi(ent_tarih.get(), ent_evrak.get(), ent_gider.get(), ent_kfirma.get(), ent_aciklama.get(),
                      float(ent_tutar.get()))

    tree.delete(*tree.get_children())
    listele()
    entrytemizle()


def guncelle():
    secim = tree.focus()
    degerler = tree.item(secim, 'values')
    if degerler == "":
        messagebox.showinfo(title="Seçim ", message="Tablodan ilgili satırı seçiniz")
    else:
        secim = tree.focus()
        degerler = tree.item(secim, 'values')
        db.veriguncelle(degerler[0], ent_tarih.get(), ent_evrak.get(), ent_gider.get(), ent_kfirma.get(),
                        ent_aciklama.get(), float(ent_tutar.get()))
    tree.delete(*tree.get_children())
    listele()
    ent_tarih.delete(0, END)
    ent_evrak.delete(0, END)
    ent_gider.delete(0, END)
    ent_kfirma.delete(0, END)
    ent_aciklama.delete(0, END)
    ent_tutar.delete(0, END)
    ent_tutar.insert(0, "0")
    btn_kaydet.config(state=NORMAL)


def sil():
    secim = tree.focus()
    degerler = tree.item(secim, 'values')

    if degerler == "":
        messagebox.showinfo(title="Seçim ", message="Tablodan ilgili satırı seçiniz")
    else:
        secim = tree.focus()
        degerler = tree.item(secim, 'values')
        silme_onay = messagebox.askyesno("Silme İşlemi Uyarısı", "Seçtiğiniz veri silinecektir. Eminmisiniz??")
        if silme_onay:
            for veri in db.veriler():
                if degerler[0] == str(veri[0]):
                    db.verisil(degerler[0])

    listele()
    entrytemizle()
    btn_kaydet.config(state=NORMAL)


def entrytemizle():
    global sayac
    tree.delete(*tree.get_children())
    ent_tarih.delete(0, END)
    ent_evrak.delete(0, END)
    ent_gider.delete(0, END)
    ent_kfirma.delete(0, END)
    ent_aciklama.delete(0, END)
    ent_tutar.delete(0, END)
    ent_tutar.insert(0, "0")
    listele()
    sayac += 1
    btn_kaydet.config(state=NORMAL)


def tablosecim(event):
    btn_kaydet.config(state=DISABLED)
    secim = tree.focus()
    degerler = tree.item(secim, 'values')
    ent_tarih.delete(0, END)
    ent_evrak.delete(0, END)
    ent_gider.delete(0, END)
    ent_kfirma.delete(0, END)
    ent_aciklama.delete(0, END)
    ent_tutar.delete(0, END)
    try:
        ent_tarih.insert(0, degerler[1])
        ent_evrak.insert(0, degerler[2])
        ent_gider.insert(0, degerler[3])
        ent_kfirma.insert(0, degerler[4])
        ent_aciklama.insert(0, degerler[5])
        ent_tutar.insert(0, degerler[6])
    except IndexError:
        pass


def listele():
    global sayac
    for veri in db.veriler():
        if sayac % 2 == 0:
            tree.insert(parent="", index=END, values=veri, tags="renk2")
        else:
            tree.insert(parent="", index=END, values=veri, tags="renk1")
        sayac += 1


def arama():
    if rbtn_var.get() == 1:
        if ent_gider.get() == "":
            messagebox.showinfo(title="Hata", message="Gider Türü kısmı boş, ister tablodan, isterseniz elle yazınız")
        else:
            top = Toplevel()
            top.geometry("700x330+1120+100")
            top.title("Arama Sonuçları : Gider Türüne Göre")

            frm_tree1 = Frame(top)
            frm_tree1.pack()
            scrollbar1 = Scrollbar(frm_tree1)
            scrollbar1.pack(side=RIGHT, fill=Y)

            tree1 = ttk.Treeview(frm_tree1, yscrollcommand=scrollbar1.set, height=10, show="headings")
            tree1["columns"] = "1", "2", "3", "4", "5", "6", "7"
            tree1.pack(padx=10)
            '# Scroll barın treeview e entegresi'
            scrollbar1.config(command=tree1.yview)
            '# Treeview sütün adları ve genişliklerinin ayarlanması'
            tree1.column("1", width=30, anchor=CENTER), tree1.heading("1", text="id", anchor=CENTER)
            tree1.column("2", width=80),  tree1.heading("2", text="Tarih", anchor=CENTER)
            tree1.column("3", width=80),  tree1.heading("3", text="Evrak", anchor=W)
            tree1.column("4", width=80),  tree1.heading("4", text="Gider Türü", anchor=W)
            tree1.column("5", width=120), tree1.heading("5", text="Kişi/Firma", anchor=W)
            tree1.column("6", width=200), tree1.heading("6", text="Açıklama", anchor=W)
            tree1.column("7", width=80),  tree1.heading("7", text="Tutar TL", anchor=W)

            btn_kapat = ttk.Button(top, text="Kapat", command=top.destroy)
            btn_kapat.pack(pady=10)
            for sonuc in db.veriara_gider(ent_gider.get()):
                tree1.insert(parent="", index=END, values=sonuc)

    if rbtn_var.get() == 2:
        if ent_kfirma.get() == "":
            messagebox.showinfo(title="Hata", message="Kişi/Firma kısmı boş, ister tablodan, isterseniz elle yazınız")
        else:
            top = Toplevel()
            top.geometry("700x330+1120+100")
            top.title("Arama Sonuçları : Kişi/Firmaya Göre")

            frm_tree1 = Frame(top)
            frm_tree1.pack()
            scrollbar1 = Scrollbar(frm_tree1)
            scrollbar1.pack(side=RIGHT, fill=Y)

            tree1 = ttk.Treeview(frm_tree1, yscrollcommand=scrollbar1.set, height=10, show="headings")
            tree1["columns"] = "1", "2", "3", "4", "5", "6", "7"
            tree1.pack(padx=10)
            '# Scroll barın treeview e entegresi'
            scrollbar1.config(command=tree1.yview)
            '# Treeview sütün adları ve genişliklerinin ayarlanması'
            tree1.column("1", width=30, anchor=CENTER), tree1.heading("1", text="id", anchor=CENTER)
            tree1.column("2", width=80),  tree1.heading("2", text="Tarih", anchor=CENTER)
            tree1.column("3", width=80),  tree1.heading("3", text="Evrak", anchor=W)
            tree1.column("4", width=80),  tree1.heading("4", text="Gider Türü", anchor=W)
            tree1.column("5", width=120), tree1.heading("5", text="Kişi/Firma", anchor=W)
            tree1.column("6", width=200), tree1.heading("6", text="Açıklama", anchor=W)
            tree1.column("7", width=80),  tree1.heading("7", text="Tutar TL", anchor=W)

            btn_kapat = ttk.Button(top, text="Kapat", command=top.destroy)
            btn_kapat.pack(pady=10)
            for sonuc in db.veriara_firma(ent_kfirma.get()):
                tree1.insert(parent="", index=END, values=sonuc)

    if rbtn_var.get() == 3:
        if ent_aciklama.get() == "":
            messagebox.showinfo(title="Hata", message="Açıklama kısmı boş, ister tablodan, isterseniz elle yazınız")
        else:
            top = Toplevel()
            top.geometry("700x330+1120+100")
            top.title("Arama Sonuçları : Açıklamaya Göre")

            frm_tree1 = Frame(top)
            frm_tree1.pack()
            scrollbar1 = Scrollbar(frm_tree1)
            scrollbar1.pack(side=RIGHT, fill=Y)

            tree1 = ttk.Treeview(frm_tree1, yscrollcommand=scrollbar1.set, height=10, show="headings")
            tree1["columns"] = "1", "2", "3", "4", "5", "6", "7"
            tree1.pack(padx=10)
            '# Scroll barın treeview e entegresi'
            scrollbar1.config(command=tree1.yview)
            '# Treeview sütün adları ve genişliklerinin ayarlanması'
            tree1.column("1", width=30, anchor=CENTER), tree1.heading("1", text="id", anchor=CENTER)
            tree1.column("2", width=80),  tree1.heading("2", text="Tarih", anchor=CENTER)
            tree1.column("3", width=80),  tree1.heading("3", text="Evrak", anchor=W)
            tree1.column("4", width=80),  tree1.heading("4", text="Gider Türü", anchor=W)
            tree1.column("5", width=120), tree1.heading("5", text="kişi/Firma", anchor=W)
            tree1.column("6", width=200), tree1.heading("6", text="Açıklama", anchor=W)
            tree1.column("7", width=80),  tree1.heading("7", text="Tutar TL", anchor=W)

            btn_kapat = ttk.Button(top, text="Kapat", command=top.destroy)
            btn_kapat.pack(pady=10)
            for sonuc in db.veriara_aciklama(ent_aciklama.get()):
                tree1.insert(parent="", index=END, values=sonuc)


'#======================================= STYLE UYGULAMA ==========================================================='
style = ttk.Style()
style.theme_use("xpnative")
style.configure("Treeview", background="#d3d3d3", foreground="#000", rowheight=24, fieldbackground="#d3d3d3")
style.configure("TLabel", font=("JetBrains Mono", 10), background="#0078d7", foreground="white")
style.map("Treeview", background=[("selected", "#0078d7")])
'# =================================================Treeviev kısmı framesi========================================'
frm_tree = Frame(root)
frm_tree.pack(pady=10)
'# Treeviev scroll bar oluşturma'
scrollbar = Scrollbar(frm_tree)
scrollbar.pack(side=RIGHT, fill=Y)
'# Treeview oluşturma'
tree = ttk.Treeview(frm_tree, yscrollcommand=scrollbar.set, height=15, show="headings")
tree["columns"] = "1", "2", "3", "4", "5", "6", "7"
tree.pack()
'# Scroll barın treeview e entegresi'
scrollbar.config(command=tree.yview)
'# Treeview sütün adları ve genişliklerinin ayarlanması'
tree.column("1", width=30, anchor=CENTER),  tree.heading("1", text="id", anchor=CENTER)
tree.column("2", width=80),  tree.heading("2", text="TARİH", anchor=CENTER)
tree.column("3", width=80),  tree.heading("3", text="EVRAK", anchor=W)
tree.column("4", width=80),  tree.heading("4", text="GİDER TÜRÜ", anchor=W)
tree.column("5", width=120), tree.heading("5", text="KİŞİ/FİRMA", anchor=W)
tree.column("6", width=460), tree.heading("6", text="AÇIKLAMA", anchor=W)
tree.column("7", width=80),  tree.heading("7", text="TUTAR TL", anchor=W)
tree.bind("<ButtonRelease>", tablosecim)
tree.tag_configure("renk1", background="white")
tree.tag_configure("renk2", background="#cfcfcf")
'#==================================VERİ GİRİŞİ FRAMESİ====================================================='
frm_data = Frame(root)
frm_data.pack(expand=True, fill=X, padx=25)
lbl_tarih = ttk.Label(frm_data, text="TARİH", width=10, anchor=CENTER)
lbl_tarih.grid(row=0, column=0)
lbl_evrak = ttk.Label(frm_data, text="EVRAK", width=10, anchor=CENTER)
lbl_evrak.grid(row=0, column=1)
lbl_gider = ttk.Label(frm_data, text="GİDER TÜRÜ", width=12, anchor=CENTER)
lbl_gider.grid(row=0, column=2)
lbl_kfirma = ttk.Label(frm_data, text="KİŞİ FİRMA", width=20, anchor=CENTER)
lbl_kfirma.grid(row=0, column=3)
lbl_aciklama = ttk.Label(frm_data, text="AÇIKLAMA", width=54, anchor=CENTER)
lbl_aciklama.grid(row=0, column=4)
lbl_tutar = ttk.Label(frm_data, text="TUTAR TL", width=8, anchor=CENTER)
lbl_tutar.grid(row=0, column=5)
ent_tarih = Entry(frm_data, width=10, font=("JetBrains Mono", 10))
ent_tarih.grid(row=1, column=0)
ent_evrak = Entry(frm_data, width=10, font=("JetBrains Mono", 10))
ent_evrak.grid(row=1, column=1)
ent_gider = Entry(frm_data, width=12, font=("JetBrains Mono", 10))
ent_gider.grid(row=1, column=2)
ent_kfirma = Entry(frm_data, width=20, font=("JetBrains Mono", 10))
ent_kfirma.grid(row=1, column=3)
ent_aciklama = Entry(frm_data, width=54, font=("JetBrains Mono", 10))
ent_aciklama.grid(row=1, column=4)
var_tutar = IntVar()
ent_tutar = Entry(frm_data, width=8, textvariable=var_tutar, font=("JetBrains Mono", 10))
ent_tutar.grid(row=1, column=5)

'#=============================================ARAMA KISMI =========================================================='
frm_buttonsol = LabelFrame(root, text="Arama Seçenekleri", height=50)
frm_buttonsol.pack(padx=20, pady=10, side=LEFT, expand=True, fill="both")
rbtn_var = IntVar()
rbtn_gider = ttk.Radiobutton(frm_buttonsol, text="Gider Türü", variable=rbtn_var, value=1, command=arama)
rbtn_gider.grid(row=0, column=0, padx=10)
rbtn_firma = ttk.Radiobutton(frm_buttonsol, text="Kişi/Firma", variable=rbtn_var, value=2, command=arama)
rbtn_firma.grid(row=0, column=1, padx=10)
rbtn_aciklama = ttk.Radiobutton(frm_buttonsol, text="Açıklama", variable=rbtn_var, value=3, command=arama)
rbtn_aciklama.grid(row=0, column=2, padx=10)

'#=============================================BUTON KISMI =========================================================='
frm_buttonsag = Frame(root)
frm_buttonsag.pack(side=RIGHT, expand=True, fill="both", padx=10, pady=20)
btn_kaydet = ttk.Button(frm_buttonsag, text="Kaydet", command=kaydet)
btn_kaydet.grid(row=0, column=0, padx=10)
btn_guncelle = ttk.Button(frm_buttonsag, text="Güncelle", command=guncelle)
btn_guncelle.grid(row=0, column=1, padx=10)
btn_sil = ttk.Button(frm_buttonsag, text="Sil", command=sil)
btn_sil.grid(row=0, column=2, padx=10)
btn_sil = ttk.Button(frm_buttonsag, text="Girişleri Temizle", command=entrytemizle)
btn_sil.grid(row=0, column=3)


listele()

root.mainloop()

5 Beğeni

bunu github veya gitlab gibi bir yerde paylaşırsanız ve insanların rahatça üzerinde çalışabilmesi için uygun bir lisans da eklerseniz çok güzel olur.

1 Beğeni