14 Ocak 2015 Çarşamba

süt hesaplayıcı

#! python3
# -*- coding: utf-8 -*-

############################
# programlayan      s@lim_yıldırım 
# proje ismi             süt hesaplayıcı
# version                 0.0.1
# time                      2013
############################

from tkinter import *
import tkinter as tk
import tkinter.ttk as ttk
from tkinter.messagebox import*
from datetime import date
from calendar import monthrange
import tkinter.scrolledtext as scrolledtext
import datetime, sqlite3, time, locale

class SütHesaplayıcı(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.veri_tabanı()
        self.tarih_işlemleri()
        self.ana_pen_araçları()
        self.süt_kartı= []
        self.yem_kartı = []
        self.kayıt_denetim = 0
        self.düzen_denetim = 0
        self.takip_pen_kntrl = 0
        
    def ana_pen_araçları(self, event=None): 
        self.çerçeve = {}
        for f in range(2):
            self.çerçeve["f%s"%f] = Frame()
            self.çerçeve["f%s"%f].grid(row=f, column=1)

        r = [2, 2, 3]
        c = [1, 2, 1]
        self.btn = {}
        self.btn_kmt = [self.hesapla, self.kayıt, self.takip_pen_araçları]
        self.fnk_lst = [self.d1, self.d2, self.d3]
        self.btn_mtn = ["Hesapla", "Kaydet", "Takip Kartı"]
        for self.b in range(len(self.btn_mtn)):
            self.btn["b%s"%self.b] = tk.Button(self.çerçeve["f1"],
                                     text      = self.btn_mtn[self.b],
                                     relief    = "groove",
                                     font      = "Helvetica 11 bold",
                                     bg        = "#4A4A4A",
                                     fg        = "#00b6ff",
                                     width     = 11,
                                     height=3,
                                     command = self.btn_kmt[self.b])
            self.btn["b%s"%self.b].grid(row=r[self.b], column=c[self.b], pady=1, padx=1)
            self.btn["b%s"%self.b].bind("", self.fnk_lst[self.b])
            self.btn["b%s"%self.b].bind("", self.ters_anm)

        cer1 = ttk.Labelframe(self.çerçeve["f1"], text="Süt Kartı", width=100, height=100)
        cer1.grid(row=0, column=0, rowspan=8)

        cer2 = ttk.Labelframe(self.çerçeve["f1"], text="Tarih İşlemleri", width=100, height=100)
        cer2.grid(row=0, column=1, columnspan=2)

        cer3 = ttk.Labelframe(self.çerçeve["f1"], text="Yem kartı", width=100, height=100)
        cer3.grid(row=1, column=1, columnspan=2)

        cer4 = ttk.Labelframe(self.çerçeve["f0"], text="Sonuç", width=100, height=100)
        cer4.grid(row=0, column=1)

        self.süt_ilk_ent = {}
        for g1 in range(16):
            ttk.Label(cer1, text="%s.Gün"%(g1+1)).grid(row=g1, column=0)
            self.süt_ilk_ent["a%s"%g1] = ttk.Entry(cer1, width=15)
            self.süt_ilk_ent["a%s"%g1].grid(row=g1, column=1)
            self.süt_ilk_ent["a%s"%g1].bind("", self.hesapla)

        self.süt_ikinci_ent = {}
        for g2 in range(15):
            ttk.Label(cer1, text="%s.Gün"%(g2 + 17)).grid(row=g2, column=2)
            self.süt_ikinci_ent["a%s"%g2] = ttk.Entry(cer1, width=15)
            self.süt_ikinci_ent["a%s"%g2].grid(row=g2, column=3)
            self.süt_ikinci_ent["a%s"%g2].bind("", self.hesapla)
            
        self.comb = {}
        cmb_set_lst = [self.ay, self.yıl]
        cmb_vls_lst = [list(self.ay_listesi.values()), [self.yıl -i for i in range(20)]]
        for c in range(2):
            self.comb["a%s"%c] = ttk.Combobox(cer2, width=14,
                                         values = cmb_vls_lst[c])
            self.comb["a%s"%c].grid(row=0, column=c, sticky="w", pady=4)
            self.comb["a%s"%c].bind("", self.hesapla)
            self.comb["a%s"%c].set(cmb_set_lst[c])

        self.ent_mtn = ["Litre Fiyatı", "Süt Yemi Fiyatı", "Süt Yemi Miktarı",
                       "Besi Yemi Fiyatı", "Besi Yemi Miktarı", "Küsbe Fiyatı", "Küsbe Miktarı"]
        self.ym_krt_ent = {}
        for y in range(7):
            ttk.Label(cer3, text=self.ent_mtn[y]).grid(row=y, column=0, sticky="w")
            self.ym_krt_ent["a%s"%y] = ttk.Entry(cer3)
            self.ym_krt_ent["a%s"%y].grid(row=y, column=1)
            self.ym_krt_ent["a%s"%y].bind("", self.hesapla)

        self.sonuç = scrolledtext.ScrolledText(cer4, width=60, height=5)
        self.sonuç.grid(row=0, column=0, pady=1, padx=2)
        self.reklam_mtn = "Süt Hesaplayıcı Bir S@lim yıldırım Ürünüdür"
        self.sonuç.insert(END, self.reklam_mtn.center(60, "-"))

    def d1(self, event=None):
        self.btn["b0"]["fg"] = "#FFF"

    def d2(self, event=None):
        self.btn["b1"]["fg"] = "#FFF"

    def d3(self, event=None):
        self.btn["b2"]["fg"] = "#FFF"

    def ters_anm(self, event=None):
        for b in range(3):
            self.btn["b%s"%b]["fg"] = "#00b6ff"

    def hesapla(self, event=None):
        self.süt_kartı= []
        self.yem_kartı = []
        self.sonuç.delete(0.0, "end")
        if not self.comb["a0"].get():
            showerror("Hata!", "Bulunduğunuz ay'ı belirtmediniz!",
                  detail="Lütfen herhangi bir ay adı giriniz!")
            self.sonuç.insert(END, self.reklam_mtn.center(60, "-"))
            return "break"
    
        else:
            if not self.comb["a1"].get():
                showerror("Hata!", "Bulunduğunuz yılı belirtmediniz!",
                      detail="Lütfen herhangi bir yıl adı giriniz!")
                self.sonuç.insert(END, self.reklam_mtn.center(60, "-"))
                return "break"
            else:
                try:
                    for h1 in range(16):
                        self.süt_kartı.append(int and float(self.süt_ilk_ent["a%s"%h1].get()))
                    for h2 in range(15):
                        self.süt_kartı.append(int and float(self.süt_ikinci_ent["a%s"%h2].get()))
                    for y in range(7):
                        self.yem_kartı.append(int and float(self.ym_krt_ent["a%s"%y].get()))

                    süt_tutarı = sum(self.süt_kartı)*(self.yem_kartı[0]) 
                    yem_borcu = ((self.yem_kartı[1] * self.yem_kartı[2]) +
                                     (self.yem_kartı[3] * self.yem_kartı[4]) +
                                     (self.yem_kartı[5] * self.yem_kartı[6]))
                    brüt_gelir = süt_tutarı - yem_borcu

                    if brüt_gelir > 0:
                        m_tin="Alacak {} tl".format(brüt_gelir)
                    elif brüt_gelir == 0:
                        m_tin = "Başabaş"
                    else:
                        m_tin = "Borç {} tl".format(abs(brüt_gelir))
                    
                    snç_mtn = "Süt Tutarı {} tl\nYem Borcu {} tl\n{}".format(süt_tutarı,
                                                                             yem_borcu, m_tin)
                    self.sonuç.insert(END, self.reklam_mtn.center(60, "-"))
                    self.sonuç.insert(END, snç_mtn)
    
                    self.ay_nmr = int and float(list(self.ay_listesi.values()
                                                     ).index(self.comb["a0"].get())+1)
                    self.sıra_nmr = int and float("{}{}".format(self.comb["a1"].get(),
                                                              (self.ay_nmr/2)))
                except ValueError:
                    showerror("Hata!", "Lütfen sadece sayı girin!")
                    self.sonuç.insert(END, self.reklam_mtn.center(60, "-"))

    def takip_pen_araçları(self):
        if not self.takip_pen_kntrl:
            def takip_pen_sorgu():
                self.takip_pen_kntrl = 0
                gösterge_paneli.destroy()

            try:
                self.veritabanı.commit()
                self.imge.execute("""SELECT * FROM süt""")
                self.c = self.imge.fetchall()
            
                gösterge_paneli = Toplevel()
                gösterge_paneli.title("Süt&Yem Takip Kartı")
                gösterge_paneli.resizable(False, False)
                gösterge_paneli.wm_protocol("WM_DELETE_WINDOW", takip_pen_sorgu)
                self.takip_pen_kntrl = 1
                self.gösterge_far = {}
                for f in range(4):
                    self.gösterge_far["a%s"%f]= Frame(gösterge_paneli)
                    self.gösterge_far["a%s"%f].grid(row=0, column=f, padx=2, pady=2)

                self.cevap_l = {}
                self.başlık_l = {}
                başlık_listesi = ["Ay & Yıl", "Toplam Dökülen Süt", "Litre fiyatı",
                    "Süt Yemi Fiyatı", "Süt Yemi Miktarı", "Besi Yemi Fiyatı",
                    "Besi Yemi Miktarı", "Küsbe Fiyatı", "Küsbe Miktarı", 
                    "Toplam Yem Borcu", "Bürüt Kazanç/Borç",
                              "Kayıt Tarihi", "Değiştirilme Tarihi"]
                for i in range(13):    
                    self.başlık_l["a%s"%i] = Label(self.gösterge_far["a1"],
                                                text = başlık_listesi [i],anchor="w",
                                               fg="white", bg="orange", width=15)
                    self.başlık_l["a%s"%i].grid(row=i, column=0, sticky="news", pady=1, padx=1)
                    self.cevap_l["a%s"%i] = Label(self.gösterge_far["a1"], width=25, bg="light green",
                                              anchor="w")
                    self.cevap_l["a%s"%i].grid(row=i, column=1, sticky="news", pady=1, padx=1)

                self.sütunlar = ["Ay" , "Yıl",]
                self.sçnk_kts = ttk.Treeview(self.gösterge_far["a0"], columns=self.sütunlar,
                                  show="headings", height=15)
        
                scb = ttk.Scrollbar(self.gösterge_far["a0"],
                                orient=VERTICAL)
                scb.grid(column=1, row=0, sticky="news")
                self.sçnk_kts['yscrollcommand'] = scb.set
                for sütun in range(2):
                    self.sçnk_kts.heading(self.sütunlar[sütun], text=self.sütunlar[sütun])
                    self.sçnk_kts.column(self.sütunlar[sütun], width = 100, anchor = 'center')

                for değer in sorted(self.c): 
                    self.sçnk_kts.insert("", "end", values=(değer[1], değer[2]))
                self.sçnk_kts.bind("", self.takip)
                self.sçnk_kts.bind("", self.sağtık)
                self.sçnk_kts.grid(row=0, column=0, sticky='news')
            except sqlite3.OperationalError:
                showwarning("Uyarı!" , "Kayıtlı herhangi bir veri yok!",
                            detail = "Lütfen önce herhangi bir yılın herhangi bir ayına ait kayıt giriniz!")

    def düzenle(self):
        self.seçilen = self.sçnk_kts.selection()
        self.silinen = self.sçnk_kts.item(item=self.seçilen)["values"]
        if self.seçilen :
            for i in self.c:
                if i[1] == self.silinen[0] and i[2] == str(self.silinen[1]):
                    süt_kartı_ilk = eval(i[3])[0:16]
                    süt_kartı_iki = eval(i[3])[16:31]
                    yem_kartı = eval(i[4])
                    for trh in range(2):
                        self.comb["a%s"%trh].set(i[trh+1])
                    for g1 in range(16):
                        self.süt_ilk_ent["a%s"%g1].delete(0, "end")
                        self.süt_ilk_ent["a%s"%g1].insert(0, round(süt_kartı_ilk[g1]))
                    for g2 in range(15):
                        self.süt_ikinci_ent["a%s"%g2].delete(0, "end")
                        self.süt_ikinci_ent["a%s"%g2].insert(0, süt_kartı_iki[g2])
                    for y in range(7):
                        self.ym_krt_ent["a%s"%y].delete(0, "end")
                        self.ym_krt_ent["a%s"%y].insert(0, yem_kartı[y])
                    self.düzen_denetim = 1
                    
    def sil(self):
        self.seçilen = self.sçnk_kts.selection()
        self.silinen = self.sçnk_kts.item(item=self.seçilen)["values"]
        if self.seçilen :
            for i in self.c:
                if i[1] == self.silinen[0] and i[2] == str(self.silinen[1]):
                    sor = askyesno("DİKKAT!", "%s yılı\
%s ayı ile ilgili kaydı silmek istediğinize emin misiniz?"%(i[2], i[1]))            
                    if sor:
                        self.imge.execute("""DELETE FROM süt WHERE sıra = ? """, (i[0],) )
                        self.veritabanı.commit()
                        self.sçnk_kts.delete(self.seçilen)
                        showinfo("Tamamlandı" , "%s yılının %s ayına ait kayıt silindi."%(i[2], i[1]))

    def sağtık(self, event):
        self.anamenu = Menu(tearoff=0)
        mn_k_listesi = [self.düzenle, self.sil, self.takip]
        mn_i_listesi =["Düzenle", "Sil", "Sonuç"] 
        for m in range(3):
            self.anamenu.add_command(label=mn_i_listesi[m],
                                     command=mn_k_listesi[m])

        satır = self.sçnk_kts.identify_row(event.y)
        if satır:
            self.sçnk_kts.selection_set(satır)
            self.anamenu.tk_popup(event.x_root, event.y_root)         
    
    def takip(self, event=None):
        self.seçilen = self.sçnk_kts.selection()
        self.silinen = self.sçnk_kts.item(item=self.seçilen)["values"]
        if self.seçilen :
            for i in self.c:
                if i[1] == self.silinen[0] and i[2] == str(self.silinen[1]):
                    süt_kartı = eval(i[3])
                    yem_kartı = eval(i[4])
                    yem_borcu = ((yem_kartı[1]*yem_kartı[2])+
                                 (yem_kartı[3]*yem_kartı[4])+
                                 (yem_kartı[5]*yem_kartı[6]))
                    bürüt_kznç = ((sum(süt_kartı)*yem_kartı[0])) - yem_borcu
                    takip_listesi = ["%s %s"%(i[1], i[2]), sum(süt_kartı), yem_kartı[0],
                                     yem_kartı[1], round(yem_kartı[2]), yem_kartı[3],
                                     round(yem_kartı[4]), yem_kartı[5], round(yem_kartı[6]),
                                     yem_borcu, round(abs(bürüt_kznç)), i[5], i[6]]
                
                    for i in range(13):
                        self.cevap_l["a%s"%i]["text"] = takip_listesi[i]
                    if bürüt_kznç > 0:
                        self.başlık_l["a10"]["text"] = "Kazanç\t\t\t:"
                        self.başlık_l["a10"]["bg"]="blue"
                        self.cevap_l["a10"]["bg"]="blue"
                    elif bürüt_kznç == 0:
                        self.başlık_l["a10"]["text"] = "alacağınız yok"
                        self.başlık_l["a10"]["bg"]="firebrick"
                        self.cevap_l["a10"]["bg"]="firebrick"
                    else:
                        self.başlık_l["a10"]["text"] = "Borç\t\t\t:"
                        self.başlık_l["a10"]["bg"]="red"
                        self.cevap_l["a10"]["bg"]="red"

    def veri_tabanı(self):
        try:
            self.veritabanı = sqlite3.connect("süt_hesaplayıcı.db")
            self.imge = self.veritabanı.cursor()
        except sqlite3.OperationalError:
            pass
        
    def kayıt(self):
        if self.süt_kartı == [] or  not self.comb["a0"].get()  and not self.comb["a1"].get():
            cevap = showwarning("Uyarı!" , "Lütfen Süt ve Yem Kartı'nı\
 doldurduğunuzdan emin olunuz!")
    
        elif len(self.comb["a1"].get()) < 4 or len(self.süt_kartı)<31 or len(self.yem_kartı)<7:
            showwarning("Uyarı!" , "Lütfen Süt ve Yem Kartı'nı\
 doldurduğunuzdan emin olunuz!")
        else:
            kayıt_tarihi = "{} {} {} {}. {}".format(time.strftime("%d"),
                                                    self.ay_listesi[self.bugün.month],
                                                    self.bugün.year,
                                                    self.gün[self.bugün.weekday()],
                                                    time.strftime("%X"))
            değiştirme_tarihi = "---"
            self.imge.execute("""CREATE TABLE if not exists süt
(sıra unique,ay, yıl, süt_listesi, yem_listesi, kayıt_tarihi, değiştirme_trh)""")
            if self.düzen_denetim == 0: 
                try:
                    self.imge.execute("""INSERT INTO süt VALUES (
                       ?, ?, ?, ?, ?, ?, ?)""",
                       (self.sıra_nmr,  self.comb["a0"].get(), self.comb["a1"].get(),
                        str(self.süt_kartı), str(self.yem_kartı), kayıt_tarihi, değiştirme_tarihi))
                    showinfo("Tamamlandı" , "%s yılı %s ayı ile ilgili veri başarıyla kaydedildi!"
                     %(self.comb["a1"].get(), self.comb["a0"].get()))

                    for g1 in range(16):
                        self.süt_ilk_ent["a%s"%g1].delete(0, "end")
                    for g2 in range(15):
                        self.süt_ikinci_ent["a%s"%g2].delete(0, "end")
                    for y in range(7):
                        self.ym_krt_ent["a%s"%y].delete(0, "end")
                    cmb_set_lst = [self.ay, self.yıl]
                    for c in range(2):
                        self.comb["a%s"%c].set(cmb_set_lst[c])
                    self.sonuç.delete(0.0, "end")
                    self.sonuç.insert(END, self.reklam_mtn.center(60, "-"))
                
                except sqlite3.IntegrityError:
                    soruni=showwarning("Uyarı!" , " %s yılının %s ayı ile ilgili kayıt zaten var!"
                               %(self.comb["a1"].get(), self.comb["a0"].get()),
                            detail = "Var olan kayıt üzerine kayıt yapamazsınız!",
                            type=RETRYCANCEL)
            if self.düzen_denetim == 1:
                devam = askyesno("Değiştirilecek", " %s yılının %s ayı ile ilgili kayıt değiştirilecek!"
                                 %(self.comb["a1"].get(), self.comb["a0"].get()),
                                 detail = "devam edilsin mi?",
                            type=YESNO)
                if devam:
                    self.imge.execute("""UPDATE süt SET ay = ?, yıl= ?, süt_listesi= ?,
yem_listesi= ?, değiştirme_trh = ? WHERE sıra = ? """,
                              (self.comb["a0"].get(), self.comb["a1"].get(),
                        str(self.süt_kartı), str(self.yem_kartı), kayıt_tarihi, self.sıra_nmr))
                    self.veritabanı.commit()
                    for g1 in range(16):
                        self.süt_ilk_ent["a%s"%g1].delete(0, "end")
                    for g2 in range(15):
                        self.süt_ikinci_ent["a%s"%g2].delete(0, "end")
                    for y in range(7):
                        self.ym_krt_ent["a%s"%y].delete(0, "end")
                    cmb_set_lst = [self.ay, self.yıl]
                    for c in range(2):
                        self.comb["a%s"%c].set(cmb_set_lst[c])
                    self.sonuç.delete(0.0, "end")
                    self.sonuç.insert(END, self.reklam_mtn.center(60, "-"))
                    showinfo("Başarılı" , "%s yılı %s ayı ile ilgili veri başarıyla değiştirildi!"
                     %(self.comb["a1"].get(), self.comb["a0"].get()))
                    self.düzen_denetim = 0
                    
    def tarih_işlemleri(self):
        locale.setlocale(locale.LC_ALL, 'turkish')
        self.bugün = datetime.date.today()
        self.yıl = self.bugün.year
        self.ay = datetime.datetime.strftime(self.bugün, '%B')

        self.ay_listesi = {1: "Ocak", 2: "Şubat", 3: "Mart",
                           4: "Nisan", 5: "Mayıs", 6: "Haziran",
                           7: "Temmuz", 8: "Ağustos", 9: "Eylül",
                           10: "Ekim", 11: "Kasım", 12: "Aralık"}

        self.gün ={0: "Pazartesi", 1: "Salı", 2: "Çarşamba",
                        3: "Perşembe", 4: "Cuma", 5: "Cumartesi",
                        6: "Pazar"}
    
if __name__ == '__main__':
    süt = SütHesaplayıcı()
    süt.title("Süt Hesaplayıcı")
    süt.resizable(False, False)
    süt.mainloop()