Gelir Gider uygulaması

Merhaba, ben İzmir Bergama’da yaşayan bir çiftçiyim ve pyhton öğrenmeye başladım. Kendim için özelleştirebileceğim bir gelir gider takibi programı yazmak istiyorum. İlerleyen zamanlarda react native öğrenmek istiyorum ve programı mobil e de taşımak istiyorum. Her türlü fikir ve yardıma açığım. Şimdiden ilgilenenlere teşekkür ederim.

4 Beğeni

Arayüzü en sade ve anlaşılır seviyede tutun. İstaistikleri farklı grafiklerde göstermek ve bunları .pdf gibi çıktısı alınabilir şekilde görmek kullanıcıları memnun edecektir.

1 Beğeni

Merhaba,

Bu konuyla ilgili yaptığım birbirinden farklı bir sürü çalışma var. Örnek olması açısından ve kodları inceleyerek kendine farklı fikirler üretmek amaçlı istersen seninle paylaşırım. github hesabım olmadığı için mail adresi verirsen gönderirim.

from tkinter import *
from tkinter import messagebox
from tkinter import ttk

import sqlite3 as sq

from datetime import datetime as dt

import os

import ttkcalendar, calendar

class Application(object):

    def __init__(self):

        self.basliklar_1 = ["TARİH", "TÜR", "KATEGORİ", "AÇIKLAMA", "TUTAR"]
        self.basliklar_2 = ["MEVCUT BAKİYE", "TOPLAM GELİR", "TOPLAM GİDER"]

        self.klasor_olustur()
        self.database()
        self.main()
        self.verileri_cek()

    def klasor_olustur(self):

        self.klasorler = os.listdir()
        for self.i in self.klasorler:
            if self.i == "000veritabani":
                break
            else:
                os.mkdir("000veritabani")        

    def database(self):
        
        self.con = sq.connect("000veritabani/database.db")
        self.cursor = self.con.cursor()

        self.cursor.execute("CREATE TABLE IF NOT EXISTS HESAP_HAREKETLERI_BNK (TARIH TEXT, TUR TEXT, KATEGORI TEXT, ACIKLAMA TEXT, TUTAR FLOAT, KAYIT_TARIHI TEXT)")
        self.con.commit()

    def main(self):

        self.pencere_1 = Tk()
        self.pencere_1.title("GELİR GİDER TAKİP PROGRAMI ## SATEMSOFT")
        self.pencere_1.geometry("+500+300")
        self.pencere_1.resizable(FALSE, FALSE)

        self.kolon = 1
        self.satir = 1

        for self.i in self.basliklar_1:

            self.etiket_1 = Label(self.pencere_1, text=self.i, width=15).grid(row=self.satir, column=self.kolon)
            self.kolon += 1

        self.entry_1 = Entry(self.pencere_1, borderwidth=2)
        self.entry_1.bind('<Button-1>', lambda x: self.popup_calendar(self.entry_1))
        self.entry_1.grid(row=2, column=1, padx=5)

        self.nn = StringVar()
        self.entry_2 = ttk.Combobox(self.pencere_1, textvariable=self.nn)
        self.entry_2.grid(row=2, column=2, padx=5)
        self.entry_2['values'] = ('GELİR', 'GİDER')
        
        self.entry_3 = Entry(self.pencere_1, borderwidth=2)
        self.entry_3.grid(row=2, column=3, padx=5)
        self.entry_4 = Entry(self.pencere_1, borderwidth=2)
        self.entry_4.grid(row=2, column=4, padx=5)
        self.entry_5 = Entry(self.pencere_1, borderwidth=2)
        self.entry_5.grid(row=2, column=5, padx=5)

        self.button_1 = Button(self.pencere_1, text="KAYDET", width=35, command=self.kaydet, bg="lightgreen").grid(row=3, column=1, columnspan=2)
        self.etiket_1 = Label(self.pencere_1, text="SATEMSOFT",width=15).grid(row=3, column=3)
        self.button_2 = Button(self.pencere_1, text="TEMİZLE", width=35, command=self.temizle, bg="lightblue").grid(row=3, column=4, columnspan=2)

        self.etiket_1 = Label(self.pencere_1, text="ÖZET VERİLER", width=35).grid(row=4, column=1, columnspan=2)
        self.logo = PhotoImage(file="satemsoftlogo.png")
        self.logo_1 = Label(self.pencere_1, image=self.logo).grid(row=4, column=3)

        self.button_3 = Button(self.pencere_1, text="TÜM KAYITLARI SİL", width=35, command=self.verileri_sil, bg="gold").grid(row=4, column=4, columnspan=2)
        self.button_4 = Button(self.pencere_1, text="ÇIKIŞ YAP", width=35, command=self.cikis_yap, bg="red").grid(row=5, column=4, columnspan=2)

        self.etiket_1 = Label(self.pencere_1, text="BİLGİLENDİRME >>", width=15).grid(row=6, column=4)
        self.etiket_x = Label(self.pencere_1, text="PROGRAM AÇILDI", width=20, fg="green").grid(row=6, column=5)

        self.etiket_1 = Label(self.pencere_1, text="TARİH >>", width=15).grid(row=7, column=4)
        self.etiket_y = Label(self.pencere_1, text=dt.now(), width=20, fg="green").grid(row=7, column=5)

        self.etiket_1 = Label(self.pencere_1, text="-"*45, width=35).grid(row=8, column=1, columnspan=2)
        self.etiket_1 = Label(self.pencere_1, text="SON HAREKETLER", width=15).grid(row=8, column=3)
        self.etiket_1 = Label(self.pencere_1, text="-"*45, width=35).grid(row=8, column=4, columnspan=2)

        self.kolon = 1
        self.satir = 9

        for self.i in self.basliklar_1:

            self.etiket_1 = Label(self.pencere_1, text=self.i, width=15).grid(row=self.satir, column=self.kolon)
            self.kolon += 1

        self.durum_1 = False

    def verileri_cek(self):

        self.satir = 5
        self.kolon = 1

        for self.i in self.basliklar_2:

            self.etiket_1 = Label(self.pencere_1, text=self.i, width=15).grid(row=self.satir, column=self.kolon)
            self.satir += 1

        self.cursor.execute("SELECT SUM(TUTAR) FROM HESAP_HAREKETLERI_BNK")
        self.data_1 = self.cursor.fetchall()
        self.mevcut_bakiye = self.data_1[0][0]

        if len(self.data_1) == 0:
            self.mevcut_bakiye = "0"

        self.etiket_1 = Label(self.pencere_1, text=str(self.mevcut_bakiye)+" TL", width=15).grid(row=5, column=2)

        self.cursor.execute("SELECT SUM(TUTAR) FROM HESAP_HAREKETLERI_BNK WHERE TUR = ?",("GELİR",))
        self.data_2 = self.cursor.fetchall()
        self.toplam_gelir = self.data_2[0][0]

        if len(self.data_2) == 0:
            self.toplam_gelir = "0"

        self.etiket_1 = Label(self.pencere_1, text=str(self.toplam_gelir)+" TL", width=15).grid(row=6, column=2)

        self.cursor.execute("SELECT SUM(TUTAR) FROM HESAP_HAREKETLERI_BNK WHERE TUR = ?",("GİDER",))
        self.data_3 = self.cursor.fetchall()
        self.toplam_gider = self.data_3[0][0]

        if len(self.data_3) == 0:
            self.toplam_gider = "0"

        self.etiket_1 = Label(self.pencere_1, text=str(self.toplam_gider)+" TL", width=15).grid(row=7, column=2)

        self.cursor.execute("SELECT TARIH, TUR, KATEGORI, ACIKLAMA, TUTAR FROM HESAP_HAREKETLERI_BNK ORDER BY KAYIT_TARIHI DESC LIMIT 5 OFFSET 0")
        self.data_3 = self.cursor.fetchmany(5)
                
        self.satir = 10
        self.kolon = 1
        self.x = 0
        

        if len(self.data_3) > 1:
            
            for self.i in self.data_3:

                for self.ii in self.i:
                    

                    self.etiket_1 = Label(self.pencere_1, text=self.ii, width=20).grid(row=self.satir, column=self.kolon)
                    self.x += 1
                    self.kolon += 1
                    
                    if self.kolon > 5:
                        
                        self.satir += 1
                        self.kolon = 1
        else:
            pass
        
        
    def temizle(self):

        self.entry_1.delete(0, END)
        self.entry_2.delete(0, END)
        self.entry_3.delete(0, END)
        self.entry_4.delete(0, END)
        self.entry_5.delete(0, END)

        self.etiket_x = Label(self.pencere_1, text="VERİLER TEMİZLENDİ", width=20, fg="green").grid(row=6, column=5)
        self.etiket_y = Label(self.pencere_1, text=dt.now(), width=20, fg="green").grid(row=7, column=5)

    def kaydet(self):

        self.tarih = self.entry_1.get()
        self.tur = self.entry_2.get()
        self.kategori = self.entry_3.get()
        self.aciklama = self.entry_4.get()
        self.tutar = self.entry_5.get()
        self.kayit_tarihi = dt.now()

        if len(self.tarih) and len(self.tur) and len(self.kategori) and len(self.aciklama) and len(self.tutar) > 0:
            

            self.cursor.execute("INSERT INTO HESAP_HAREKETLERI_BNK VALUES (?,?,?,?,?,?)",(self.tarih, self.tur, self.kategori, self.aciklama, self.tutar, self.kayit_tarihi))
            self.con.commit()

            self.entry_1.delete(0, END)
            self.entry_2.delete(0, END)
            self.entry_3.delete(0, END)
            self.entry_4.delete(0, END)
            self.entry_5.delete(0, END)

            messagebox.showinfo("BAŞARILI", "VERİLER KAYIT EDİLDİ")

            self.verileri_cek()

            self.etiket_x = Label(self.pencere_1, text="VERİLER KAYIT EDİLDİ", width=20, fg="green").grid(row=6, column=5)
            self.etiket_y = Label(self.pencere_1, text=dt.now(), width=20, fg="green").grid(row=7, column=5)
            
        else:

            self.etiket_x = Label(self.pencere_1, text="HATALI VERİ GİRİŞİ", width=20, fg="red").grid(row=6, column=5)
            self.etiket_y = Label(self.pencere_1, text=dt.now(), width=20, fg="red").grid(row=7, column=5)

            messagebox.showerror("HATA","LÜTFEN VERİLERİ DOĞRU GİRİNİZ")

    def verileri_sil(self):

        self.con.commit()
        self.con.close()

        self.soru_1 = messagebox.askquestion("TÜM VERİLERİ SİL","TÜM VERİLERİ SİLMEK İSTEDİĞİNİZE EMİN MİSİNİZ?",icon="warning")
        if self.soru_1 == "yes":
                
            os.remove("000veritabani/database.db")

            self.etiket_x = Label(self.pencere_1, text="VERİTABANI SİLİNDİ", width=20, fg="red").grid(row=6, column=5)
            self.etiket_y = Label(self.pencere_1, text=dt.now(), width=20, fg="red").grid(row=7, column=5)
            
            messagebox.showinfo("BİLGİLENDİRME","PROGRAM KAPATILIYOR, LÜTFEN TEKRAR BAŞLATIN.")

            self.con = sq.connect("000veritabani/database.db")
            self.con.commit()
            self.con.close()
            self.pencere_1.destroy()
            
        elif self.soru_1 == "no":
            messagebox.showinfo("BİLGİLENDİRME","PROGRAM KAPATILIYOR, LÜTFEN TEKRAR BAŞLATIN.")

            self.con = sq.connect("000veritabani/database.db")
            self.con.commit()
            self.con.close()
            self.pencere_1.destroy()

    def cikis_yap(self):

        self.soru_1 = messagebox.askquestion("ÇIKIŞ YAP","ÇIKIŞ YAPMAK İSTEDİĞİNİZE EMİN MİSİNİZ?",icon="warning")
        if self.soru_1 == "yes":

            self.con = sq.connect("000veritabani/database.db")
            self.con.commit()
            self.con.close()
            self.pencere_1.destroy()
        else:
            pass

    def popup_calendar(self, widget):

        if not self.durum_1:
        
            toplevel = Toplevel()
            toplevel.resizable(FALSE, FALSE)
            toplevel.wm_attributes('-topmost', 1)
            ttkcal = ttkcalendar.Calendar(toplevel, firstweekday=calendar.MONDAY)
            ttkcal.pack()

            self.durum_1 = True
            
            def select_date(widget):
                date = ttkcal.selection
                if date:
                    widget.delete(0, 'end')
                    widget.insert('end', '{}.{}.{}'.format(str(date.day).zfill(2), 
                                                           str(date.month).zfill(2),
                                                           date.year))
                self.durum_1 = False
                toplevel.destroy()
                    
            ok_btn = ttk.Button(toplevel, text='seç', command=lambda: select_date(widget))
            ok_btn.pack()

        
app = Application()
mainloop()

üstteki kodun çalışması için aynı dizinde bulunması gereken görsel şudur;

satemsoftlogo

4 Beğeni