7 Ekim 2014 Salı

Yeni haliyle süt hesaplayıcı 1.1.7

#! python3
# -*- coding: utf-8 -*-
#programlayan : salim_yıldırım 
#proje ismi: süt hesaplayıcı
#version = 1.1.7

from tkinter import *
import tkinter.ttk as ttk
from tkinter.messagebox import*
from tkinter.ttk import Notebook
from TitleFrame import *
import datetime
import time
import sqlite3

pencere = Tk()
vt = sqlite3.connect("süt_kayıt.db")
im = vt.cursor()

metin="""
Süt Hesaplayıcı basit bir S@lim yıldırım uygulamasıdır. S@lim Yıldırım
tarafından üretilmiştir.Ürününüz bol kazancınız çok olsun.
"""          
ayımız = " "
vri_tarih = " "
grgr = []
yem_l = []
bulunduğunuz_ay = " "
def hesapla(event=None):
    global ayımız, vri_tarih, yem_l, kayıt, grgr, bulunduğunuz_ay
    sonuç_entry.delete(0, "end")
    if not Combobox.get():
        showerror("Hata!", "Bulunduğunuz ay'ı belirtmediniz!",
                  detail="Lütfen herhangi bir ay adı giriniz!")
        return "break"
    else:    
        if not Entry["Entry1"].get():
            showerror("Hata!", "Bulunduğunuz yılı belirtmediniz!",
                      detail="Lütfen herhangi bir yıl adı giriniz!")
            return "break"
        else:
            try:
                #grgr grafik için bize günlerin
                #listesini oluşturuyor.
                grgr = []
                yem_l = []
                for i in range(11):
                    grgr.append(int and float(ei_dict["a{}".format(i)].get()))
                for s in range(11):
                    grgr.append(int and float(e1i_dict["a{}".format(s)].get()))
                for z in range(9):
                    grgr.append(int and float(e1s_dict["a{}".format(z)].get()))
                for l in range(8):
                    yem_l.append(int and float(Entry["Entry{}".format(l+1)].get()))
                iefs = sum(grgr)*(yem_l[1]) - ((yem_l[2] * yem_l[3]) + (yem_l[4] * yem_l[5]) + (yem_l[6] * yem_l[7]))                                          
                if iefs > 0:
                    m_tin="Alacak {} tl".format(iefs)                                           
                elif iefs == 0:
                    m_tin = "Başabaş"                
                else:
                    m_tin = "Borç {} tl".format(iefs)
                                                               
                sonuç_entry.insert(0, "Süt Tutarı {} tl, Yem Borcu {} tl, {}"
                                   .format(sum(grgr)*(yem_l[1]), ((yem_l[2] * yem_l[3]) +
                                    (yem_l[4] * yem_l[5]) + (yem_l[6] * yem_l[7])), m_tin))
                                                                     

                ay = {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"}
                hafta ={0: "Pazartesi", 1: "Salı", 2: "Çarşamba",
                        3: "Perşembe", 4: "Cuma", 5: "Cumartesi",
                        6: "Pazar"}
                nummerone =  list(ay.values()).index(Combobox.get())+1
                bulunduğunuz_ay = int("{}{}".format(Entry["Entry1"].get(), nummerone))
                vri_tarih = "{} {} {} {}. {}".format(time.strftime("%d"), ay[(datetime.date.today()).month],
                                                         (datetime.date.today()).year,
                                                         hafta[(datetime.date.today()).weekday()],
                                                         time.strftime("%H:%M:%S"))
       
            except ValueError:
                showerror("Hata!", "Lütfen sadece sayı girin!")
                sonuç_entry.insert(0, "Sonuç ")
            ayımız = Combobox.get()

TitleFrame.w = TitleFrame(pencere, "Süt Kartı")     #TitleFarme'yi bu şekilde
TitleFrame.w.grid(row=2, column=0, pady=5, padx=5)  #oluşturuyoruz.
cerceve1 = TitleFrame.w.getinner()

r = 0
c = 0
ei_dict = {}
while r < 11:
    label = ttk.Label(cerceve1, text="{}.Gün".format(r+1))
    label.grid(row=r, column=c, pady=1, ipady=1)
    ei_dict["a%s"%r] = ttk.Entry(cerceve1, width=10)
    ei_dict["a%s"%r].grid(row=r, column=(c+1), pady=1, ipady=1)
    label = ttk.Label(cerceve1, text="{}.Gün".format(r+12))
    label.grid(row=r, column=(c+2), pady=1, ipady=1)
    ei_dict["a{}".format(r)].bind("", hesapla)
    c += 1
    if c % 1 == 0:
        r += 1
        c = 0
r = 0
c = 0
e1i_dict = {}
while r < 11:
    e1i_dict["a%s"%r] = ttk.Entry(cerceve1, width=10)
    e1i_dict["a%s"%r].grid(row=r, column=(c+3), pady=1, ipady=1)
    e1i_dict["a{}".format(r)].bind("", hesapla)
    c += 1
    if c % 1 == 0:
        r += 1
        c = 0
r = 0
c = 4
e1s_dict = {}
while r < 9:
    label = ttk.Label(cerceve1, text="{}.Gün".format(r+23))
    label.grid(row=r, column=c, pady=1, ipady=1)
    e1s_dict["a%s"%r] = ttk.Entry(cerceve1, width=10)
    e1s_dict["a%s"%r].grid(row=r, column=(c+5), pady=1, ipady=1)
    e1s_dict["a{}".format(r)].bind("", hesapla)
    c += 1
    if c % 1 == 0:
        r += 1
        c = 4
    
#---------yem kartı-------
TitleFrame.w = TitleFrame(pencere, "Yem Kartı")
TitleFrame.w.grid(row=2, column=1, pady=5, padx=5)
cerceve3 = TitleFrame.w.getinner()
bugün = datetime.date.today()
yıl = bugün.year    
 
ay = {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"}

if bugün.month == 1:
    ayi = ay[12]
    yıli = yıl - 1
    
elif bugün.day < 10:
    a = bugün.month - 1
    ayi = ay[a]
    yıli = yıl
    
else:
    ayi = ay[bugün.month]
    yıli = yıl

Combobox = ttk.Combobox(cerceve3, width=17)
Combobox["values"] =list(ay.values())
Combobox.set(ayi)
Combobox.grid(row=0, column=1, sticky="w", padx=3, pady=1)
Combobox.bind("", hesapla)
def seciminiz(event=None):
    entrya = Combobox.get()
Combobox.bind("<>", seciminiz)

r = 0
c = 0
e_23dict = {}
while r < 11:
    e_23dict["a%s"%r] = Label(cerceve3)
    e_23dict["a%s"%r].grid(row=r, column=c, sticky="w", pady=2)
    c += 1
    if c % 1 == 0:
        r += 1
        c = 0
listi = ["Ay", "Yıl", "Litre Fiyatı", "Süt Yemi", "Fiyatı", 
         "Besi Yemi", "Fiyatı", "Küsbe", "Fiyatı"]
for i in range(9):
    e_23dict["a{}".format(i)]["text"] = listi[int("{}".format(i))]

r = 1
c = 0
Entry = {}
while r < 9:
    Entry["Entry%s"%r] = ttk.Entry(cerceve3)
    Entry["Entry%s"%r].grid(row=(r), column=(c+1), pady=2)
    Entry["Entry{}".format(r)].bind("", hesapla)
    c += 1
    if c % 1 == 0:
        r += 1
        c = 0
Entry["Entry1"].insert(0, yıli)

btn_pen2 = ttk.Button(pencere, width=98, text="Hesapla", command=hesapla)                      
btn_pen2.grid(row=1, column=0, pady=1, columnspan=2)

sonuç_entry = ttk.Entry(pencere,width=98, justify="right")                        
sonuç_entry.grid(row=0, column=0, columnspan=2, pady=6)
sonuç_entry.insert(0, "Sonuç")

kontrol2 = 0
def grafico():
    # fırat hocamızın katkısıdır. 
    global kontrol2
    if grgr == [] or  not Combobox.get()  and not Entry["Entry1"].get():
        cevap = showwarning("Uyarı!" , "Lütfen Süt ve Yem Kartı'nı\
 doldurduğunuzdan emin olunuz!")
    
    elif len(Entry["Entry1"].get()) < 4:
        showwarning("Uyarı!" , "Lütfen Süt ve Yem Kartı'nı\
 doldurduğunuzdan emin olunuz!")
    
    elif grgr != []:
        if not kontrol2:
            def sor1g():
                global kontrol2
                kontrol2 = 0
                pencere3.destroy()
    
            pencere3 = Toplevel()
            pencere3.resizable()
            pencere3.wm_protocol("WM_DELETE_WINDOW", sor1g)
            cw = 670 #genişlik
            ch = 413 #yükseklik

            c = Canvas(pencere3, width=cw, height=ch, background="white")
            c.grid(row=0, column=1, sticky="w", padx=10, pady=1)

            # x düzlemindeki çizgi
            c.create_line(12, ch, cw, ch)

            # y düzlemindeki çizgi
            c.create_line(10, 12, 10, ch) 

            for a, b in zip(range(12, ch, 100), range(100, 0, -25)):
                #sol taraftaki kesikli çizgiler
                c.create_line(13, a, 2000, a)
                #kesikli çizgiler üzerindeki değerler
                c.create_text(20, a, text=str(b)) 

            x = 45 
            y = 55
            veriler = grgr
            limit = x * len(veriler)
            while x <= limit:
                for i in veriler:
                    #verileri gösteren çubuklar
                    c.create_rectangle(x, ch-(i*4),
                                        y, ch,
                                        outline="black",
                                        fill="royalblue")
                    x += 20.5
                    y += 20.5
            pencere3.title("{} yılının {} ayına ait Süt grafiği".format(round(yem_l[0]),ayımız))
            kontrol2 = 1
        else:
            pass

kontrol = 0
def hakkında():
    global kontrol
    if not kontrol:
        def sor1():
            global kontrol
            kontrol = 0
            pencere4.destroy()
        #proje hakkında bilgi veren penceremiz.
        pencere4 = Toplevel()
        pencere4.resizable(False, False)
        pencere4.wm_attributes("-topmost", 1)
        etiket=Label(pencere4, text=metin, font=("Flux",15, "bold"))
        etiket.grid(row=9, column=0, sticky="w")
        pencere4.title("Hakkında")
        pencere4.wm_protocol("WM_DELETE_WINDOW", sor1)
        kontrol = 1
    else:
        pass
        
kayıt_denetim = 0                                                                                                                                                                                                                                                           
def sor():
    global kayıt_denetim
    kayıt_denetim = 1
    if grgr == []:
        pencere.destroy()
    elif grgr != []:
        sorun=showwarning("Kapatılacak!" , "Program kapatılacak!",
                        detail="Süt ve Yem kartlarını kaydetmek istiyormusunuz?",
                        type=YESNOCANCEL)
        
        if sorun == "no":
            pencere.destroy()
        if sorun == "cancel":
            pass
        if sorun == "yes":
            kaydet()
            if kayıt_denetim == 0:
                pencere.destroy()
            if kayıt_denetim == 1:
                pass
                  
##kaydet bölümümüz
def kaydet():
    global grgr, kayıt_denetim
    #grafik listesini boşaltıyoruz
    #ki kayıttan sonra garfik göstermesin
    isa = grgr
    if grgr == [] or not Combobox.get() and not Entry["Entry1"].get():
        showwarning("Uyarı!" , "Lütfen Süt ve Yem Kartı'nı\
 doldurduğunuzdan emin olunuz!")
    elif len(Entry["Entry1"].get()) < 4:
        showwarning("Uyarı!" , "Lütfen Süt ve Yem Kartı'nı\
doldurduğunuzdan emin olunuz!")
        
    else:
        grgr = []
        im.execute("""CREATE TABLE if not exists personel
                   (ay unique, litre_f, dökülen_süt, besi_yemi, b_fiyatı, süt_yemi,
                    s_fiyatı, küsbe, k_fiyatı, z, a_y, y_ı)""")

        try:
            im.execute("""INSERT INTO personel VALUES (
                       ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
                       (bulunduğunuz_ay, yem_l[1], sum(isa), round(yem_l[4]),
                        yem_l[5], round(yem_l[2]), yem_l[3], round(yem_l[6]),
                        yem_l[7], vri_tarih, ayımız, round(yem_l[0])))
                                                                                                                                                                       
            showinfo("Tamamlandı" , "{} yılı {} ayı ile ilgili veri başarıyla kaydedildi!"
                     .format(round(yem_l[0]),ayımız))
            for i in range(11):
                ei_dict["a{}".format(i)].delete(0, "end")
                e1i_dict["a{}".format(i)].delete(0, "end")
            for s in range(9):
                e1s_dict["a{}".format(s)].delete(0, "end")
            for si in range(7):
                Entry["Entry{}".format(si+2)].delete(0, "end")
            sonuç_entry.delete(0, "end")
            sonuç_entry.insert(0, "Sonuç ")
            kayıt_denetim = 0 
            # kayıttan sonra süt ve yem kartlarını boşaltıyoruz
            # ki yeni veri girişine müsait olsunlar.
        except sqlite3.IntegrityError:
            #aynı değerde veri girilmesin diye hata yakalıyoruz.
            soruni=showwarning("Uyarı!" , " {} yılının {} ayı ile ilgili kayıt zaten var!"
                               .format(yılımız,ayımız),
                            detail = "Var olan kayıt üzerine kayıt yapamazsınız!",
                            type=RETRYCANCEL)
            
            if soruni == "cancel": 
                pass  
            if soruni == "retry": 
                hesapla()
                kayıt_denetim = 1 
        vt.commit()
        if not kontrolg :
            pass
        if kontrolg ==1:
            pass
kontrolg = 0
k_bi_hak = 0 
def gösterge_paneli():
    global kontrolg
    #süt takip kartının kodları
    #try vasıtasıyla veri...
    #tabanımız olmasa bile hata vermiyor.
    try:
        im.execute("""SELECT * FROM personel""")
        c = im.fetchall()
        if not c:
            #veri tabanımız var ama içi boşsa
            # hata vermesini önlüyoruz.
            # bu şekilde toplevel'ın da açılmasını
            #önlüyoruz. ki hem hata hemde
            # toplevel açılmasın.
            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!")
        
        else:
            if not kontrolg:
                def sorg():
                    global kontrolg
                    kontrolg = 0
                    gösterge_paneli.destroy()
                    
                gösterge_paneli = Toplevel()
                gösterge_paneli.title("Süt&Yem Takip Kartı")
                gösterge_paneli.wm_attributes("-topmost", 1)
                gösterge_paneli.resizable(False, False)
                gösterge_paneli.wm_protocol("WM_DELETE_WINDOW", sorg)
                im.execute("""SELECT * FROM personel""")
                c = im.fetchall() 
                for i in c:
                    sütunlar = ["Ay" , "Yıl",]

                anamenu = Menu(pencere, tearoff=0)
                far = Frame(gösterge_paneli)
                far.grid(row=0, column=0, padx=20, pady=20)
                tabPanel = ttk.Notebook(far)
                page = Frame(tabPanel, bg="light green")
                page.grid(row=0, column=2, sticky="news", padx=3, pady=6)
                page1 = Frame(tabPanel, background="white")
                page1.grid(row=0, column=2, sticky="news", padx=3, pady=6)
                page2 = Frame(tabPanel, background="white")
                page2.grid(row=0, column=2, sticky="news", padx=3, pady=6)
                tabPanel.add(page, text='Sonuç')
                tabPanel.add(page1, text='Grafik')
                tabPanel.add(page2, text='Analiz')
                tabPanel.grid(row=0, column=2, ipadx=3, ipady=3)
                
                r = 0
                ci = 0
                e_2dict = {}
                e_23dict = {}
                lis = ["Ay\t\t\t:", "Yıl\t\t\t:", "Toplam Dökülen Süt\t:", "litre fiyatı\t\t:",
                       "Süt Yemi Miktarı\t\t:", "Süt Yemi Fiyatı\t\t:", "Besi Yemi Miktarı\t\t:",
                       "Besi Yemi Fiyatı\t\t:", "Küsbe Miktarı\t\t:", "Küsbe Fiyatı\t\t:",
                       "Toplam Yem Borcu\t:", "Bürüt Kazanç/Borç\t:"]
                for i in range(12):    
                    e_23dict["a%s"%r] = Label(page)
                    e_23dict["a%s"%r].grid(row=r, column=ci+6, sticky="news", padx=3, pady=6)
                    e_2dict["a%s"%r] = ttk.Entry(page, width=50)
                    e_2dict["a%s"%r].grid(row=r, column=(ci+7), sticky="news", padx=3, pady=6)
                    e_2dict["a{}".format(i)].insert(0,"Veri Yok")
                    e_23dict["a{}".format(i)]["text"] = lis[int("{}".format(i))]
                    ci += 1
                    if ci % 1 == 0:
                        r += 1
                        ci = 0
                                
                tv = ttk.Treeview(far, columns=sütunlar,
                                  show="headings")
                tv.column('Ay', width = 100, anchor = 'center')
                tv.column('Yıl', width = 100, anchor = 'center')
                s = ttk.Scrollbar(far, orient=VERTICAL, command=tv.yview)
                s.grid(column=1, row=0, sticky="news")
                tv['yscrollcommand'] = s.set              
                
                for sütun in sütunlar:
                    tv.heading(sütun, text=sütun)
                for değer in sorted(c):
                    tv.insert("", "end", values=(değer[10], değer[11]))

                def sağtık(event):
                    satır = tv.identify_row(event.y)
                    if satır:
                        tv.selection_set(satır)
                        anamenu.tk_popup(event.x_root, event.y_root)            
                vt.commit()
                im.execute("""SELECT * FROM personel""")
                c = im.fetchall()
                kontrolg = 1
                
                def gösterici(event=None):
                    for s in range(12):
                        e_2dict["a{}".format(s)].delete(0, "end")
                    seçilen = tv.selection()
                    silinen = tv.item(item=seçilen)["values"]
                    önceki_id = tv.prev(item=seçilen)#analiz için kullan
                    önceki_txt = tv.item(item=önceki_id)["values"]
                    if seçilen :
                        for i in c:
                            if i[10] == silinen[0] and i[11] == silinen[1]:
                                ief = ((i[2] * i[1])-((i[5]* i[6])+(i[3]*i[4])+(i[7]*i[8])))
                                lisi = [i[10], i[11], i[2], i[1], i[5], i[6], i[3], i[4],
                                        i[7], i[8], (i[5]* i[6])+(i[3]*i[4])+(i[7]*i[8]),
                                        round(abs(ief))] 
                                for i in range(12):
                                    e_2dict["a{}".format(i)].insert(0, lisi[int("{}".format(i))])
                                if ief > 0:
                                    e_23dict["a11"]["text"] = "Kazanç\t\t\t:"                                
                                elif ief == 0:
                                    e_23dict["a11"]["text"] = "alacağınız yok"
                                else:
                                    e_23dict["a11"]["text"] = "Borç\t\t\t:"
                                                   
                def bi_hak():
                    #burası hakkında bölümümüz. kaydettiğimiz verilerin
                    #hakkında bilgilerini buradan alıyoruz.
                    #mesela tam tarih , saat gibi.
                    #daha da geliştirilebilir.
                    global k_bi_hak
                    if not k_bi_hak:
                        def sorb():
                            global k_bi_hak
                            k_bi_hak = 0
                            hakkında.destroy()
                        hakkında = Toplevel()
                        k_bi_hak = 1
                        hakkında.title("Hakkında")
                        hakkında.wm_attributes("-topmost", 1)
                        hakkında.resizable(False, False)
                        hakkında.wm_protocol("WM_DELETE_WINDOW", sorb)
                        hakkında.columnconfigure(0, weight=1)
                        hakkında.rowconfigure(0, weight=1)
                        seçilen = tv.selection()
                        silinen = tv.item(item=seçilen)["values"]
                        tabPanel = ttk.Notebook(hakkında)
                        page = Frame(tabPanel, background="white")
                        page.grid(row=0, column=2, sticky="w", padx=3, pady=6)
                        tabPanel.add(page, text='Genel')
                        tabPanel.grid(row=0, column=2, padx=3, pady=3)
                        h_et = Label(page, justify="left", wraplength=300, bg="white")
                        h_et.grid(row=0, column=2)
                        if seçilen :
                            for i in c:
                                if i[10] == silinen[0] and i[11] == silinen[1]:
                                    h_et["text"] = """
    Program adı\t:Süt hesaplayıcı_v_1.1.7
    Programlayan\t:S@lim Yıldırım
{3}

    Dosya Adı \t: Süt&Yem Kartı {0} {1}\n
    
    Kayıt Tarihi\t: {2}\n
    
    Değiştirme\t:\t---\n
{3}
    """.format(i[10], i[11], i[9], (54*"_"))      
                    else:
                        pass                      
                        
                def sil():
                    seçilen = tv.selection()
                    silinen = tv.item(item=seçilen)["values"]
                    if seçilen :
                        for i in c:
                            if i[10] == silinen[0] and i[11] == silinen[1]:
                                sor = askyesno("DİKKAT!", "{} yılı {} ayı ile ilgili kaydı silmek istediğinize emin misiniz?"
                                               .format(i[11], i[10]))            
                                if sor:
                                    im.execute("""DELETE FROM personel WHERE ay = ? """, (i[0],) )
                                    vt.commit()
                                    tv.delete(seçilen)
                                    showinfo("Tamamlandı" , "{} yılının {} ayına ait kayıt silindi."
                                             .format(i[11], i[10]))

                tv.bind("", gösterici)
                tv.bind("", sağtık)
                tv.grid(row=0, column=0, sticky='news')

                anamenu.add_command(label="Sil", command=sil)
                anamenu.add_separator()
                anamenu.add_command(label="Sonuç", command=gösterici)
                anamenu.add_command(label="Hakkında", command=bi_hak)
    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 Analiz():
    """
şu an için aktiv olmayan bu bölümde analiz yapmayı planlıyorum.
mesela iki tarih arasındaki süt, yem vb. artış yüzdeleri falan
hatta kullanıcıya öner verme falan . 
    """
    pass
    
menu= Menu(pencere)
pencere.config(menu=menu)
dosya= Menu(menu, tearoff=0)
menu.add_cascade(label="Dosya", menu=dosya)

dosya.add_command(label="Kaydet", command=kaydet)
dosya.add_command(label="Süt Takip Kartı", command=gösterge_paneli )
dosya.add_command(label="Çıkış", command=sor)

dosya2= Menu(menu, tearoff=0)
menu.add_cascade(label="Analiz",menu=dosya2)
dosya2.add_command(label="Analiz kartı", command=Analiz)

dosya3= Menu(menu, tearoff=0)
menu.add_cascade(label="Grafik",menu=dosya3)
dosya3.add_command(label="Aylık Süt Grafiği", command=grafico)

dosya5= Menu(menu, tearoff=0)
menu.add_cascade(label="Yardım",menu=dosya5)
dosya5.add_command(label="Süt Hesaplayıcı Hakkında", command=hakkında)

pencere.title("Süt hesaplayıcı v 1.1.7")
pencere.resizable(False, False)
pencere.wm_protocol("WM_DELETE_WINDOW", sor)
pencere.mainloop()