Python - Programı Geliştirmeme Yardım Eder Misiniz? Antrenman Takip Programı - %30'u Tamamlandı

Merhaba, herkese iyi forumlar.

Öncelikle kendi kullanımım için sonrasında da hoşuna giden olursa diye paylaşmayı düşünerek programladığım bir antreman istatistikleri tutan bir programım var. Belli kısımlarını bitirdim.

Yaptıklarımı sıralayacağım, ardından çözüm bulamadığım bazı noktalar var. Bir de fikir üretemediğim bazı noktalar var. Ayrı ayrı yazacağım.

Kullandığım pencere modülü >> Tkinter
Kullandığım veritabanı modülü >> Sqlite

Yaptıklarım;

  • Ana ekranda bulunan çıkış yap butonu çalışıyor.
  • Ana ekranda bulunan “egzersiz kayıt” butonu çalışıyor. Tıklandığı zaman kayıt penceresini açıyor
  • Kayıt penceresinde bulunan “kaydet”, “temizle”, “vazgeç” butonları çalışıyor.
  • Kayıt penceresinde bulunan “kaydet” butonuna basıldığı zaman entry kontrolleri yapıyor. Uygun koşullarda sqlite a veriyi kayıt ediyor. Hata varsa uyarı mesajı veriyor.

Çözüm Bulamadıklarım;

  • Kullanıcı tarafından kayıt edilmiş verileri, kullanıcı daha sonradan görmek isterse nasıl bir ekranda nasıl bir formatta nasıl bir front-end görünümde sunmalıyım? Grafik çizelgesi düşündüm fakat bilgim yok. Alt alta dümdüz sıralamayı düşündüm fakat burada text aracını mı kullansam daha doğru olur label mi ya da başka ne kullanabilirim?

  • Kullanıcı butonlara her tıkladığın da tıkladığı kadar pencere açıyor. Bunu engellemek istiyorum. Kafa karıştırıcı bir kaç çözüm geldi aklıma denedim olmadı. Önerileriniz nedir?

Benim söylediklerim dışında sizlerinde gözlemleyip tavsiyede bulunacağı fikirlerinizi de duymak isterim. Şimdiden desteğiniz için teşekkür ederim.

Tek dosyadan oluşan antrenman.py kodları;

from tkinter import *
import sqlite3
from time import sleep

class Application(object):

    def __init__(self):

        self.create_database()
        self.main()

    def create_database(self):

        self.con = sqlite3.connect("database.db")
        self.cursor = self.con.cursor()
    
        self.cursor.execute("CREATE TABLE IF NOT EXISTS ANTREMAN_DATA (DATE TEXT, ACTIVITY TEXT, TOTAL INT)")

        self.con.close()

    def main(self):

        self.pencere1 = Tk()
        self.pencere1.title("ANTREMAN TAKİP PROGRAMI")

        self.pencere1.geometry("+760+440")

        self.pencere1.resizable(FALSE, FALSE)

        self.cerceve1 = Frame(self.pencere1)
        self.cerceve1.grid(row=0, column=0, padx=5)

        self.button1 = Button(self.pencere1, text="EGZERSİZ KAYDET", command=self.save)
        self.button1.grid(row=0, column=1)

        self.cerceve1 = Frame(self.pencere1)
        self.cerceve1.grid(row=0, column=2, padx=5)

        self.button2 = Button(self.pencere1, text="EGZERSİZ TAKİP", command=self.show)
        self.button2.grid(row=0, column=3)

        self.cerceve1 = Frame(self.pencere1)
        self.cerceve1.grid(row=0, column=4, padx=5)

        self.button3 = Button(self.pencere1, text="ÇIKIŞ YAP", command=self.pencere1.quit)
        self.button3.grid(row=0, column=5)

        self.cerceve1 = Frame(self.pencere1)
        self.cerceve1.grid(row=0, column=6, padx=5)

        

    def save(self):

        self.pencere2 = Tk()

        self.pencere2.title("ANTREMAN KAYIT EKRANI")
        self.pencere2.resizable(FALSE, FALSE)

        self.pencere2.geometry("+780+450")

        # birinci satır
        self.cerceve1 = Frame(self.pencere2)
        self.cerceve1.grid(row=0, column=0, padx=5)

        self.etiket1 = Label(self.pencere2, text="TARİH >>")
        self.etiket1.grid(row=0, column=1)

        self.cerceve1 = Frame(self.pencere2)
        self.cerceve1.grid(row=0, column=2, padx=5)

        self.girdi1 = Entry(self.pencere2)
        self.girdi1.grid(row=0, column=3)

        # ikinci satır
        self.cerceve1 = Frame(self.pencere2)
        self.cerceve1.grid(row=1, column=0, padx=5)

        self.etiket2 = Label(self.pencere2, text="ANTREMAN >>")
        self.etiket2.grid(row=1, column=1)

        self.cerceve1 = Frame(self.pencere2)
        self.cerceve1.grid(row=0, column=2, padx=5)

        self.girdi2 = Entry(self.pencere2)
        self.girdi2.grid(row=1, column=3)

        # üçüncü satır
        self.cerceve1 = Frame(self.pencere2)
        self.cerceve1.grid(row=2, column=0, padx=5)

        self.etiket3 = Label(self.pencere2, text="TOPLAM >>")
        self.etiket3.grid(row=2, column=1)

        self.cerceve1 = Frame(self.pencere2)
        self.cerceve1.grid(row=2, column=2, padx=5)

        self.girdi3 = Entry(self.pencere2)
        self.girdi3.grid(row=2, column=3)

        # dördüncü satır
        self.cerceve1 = Frame(self.pencere2)
        self.cerceve1.grid(row=3, column=0)

        self.button4 = Button(self.pencere2, text="KAYDET", command=self.save_data)
        self.button4.grid(row=3, column=1)
        
        self.button5 = Button(self.pencere2, text="TEMİZLE", command=self.delete)
        self.button5.grid(row=3, column=2)

        self.button6 = Button(self.pencere2, text="VAZGEÇ", command=self.pencere2.destroy)
        self.button6.grid(row=3, column=3)

    def show(self):

        pass

    def save_data(self):

        self.date = self.girdi1.get()
        self.activity = self.girdi2.get()
        self.total = self.girdi3.get()

        if len(self.date) != 0 or len(self.activity) != 0 and len(self.total) != 0:

            self.total = int(self.total)

            self.con = sqlite3.connect("database.db")
            self.cursor = self.con.cursor()

            self.cursor.execute("INSERT INTO ANTREMAN_DATA VALUES(?,?,?)",(self.date, self.activity, self.total))
            self.con.commit()

            self.con.close()

            self.girdi1.delete(0,END)
            self.girdi2.delete(0,END)
            self.girdi3.delete(0,END)

            self.good_win = Tk()
            self.good_win.title("BAŞARI EKRANI")

            self.good_win.geometry("+670+460")
            self.good_win.resizable(FALSE, FALSE)

            self.good_tex = Label(self.good_win, text="KAYIT İŞLEMİ BAŞARILI BİR ŞEKİLDE GERÇEKLEŞTİ.")
            self.good_tex.pack()

            self.good_but = Button(self.good_win, text="TAMAM", command=self.good_win.destroy)
            self.good_but.pack()
            

        else:

            self.warning_win = Tk()
            self.warning_win.title("UYARI EKRANI")

            self.warning_win.geometry("+670+460")
            self.warning_win.resizable(FALSE, FALSE)

            self.warning_tex = Label(self.warning_win, text="HATALI BİLGİ GİRİŞİ YAPTINIZ! LÜTFEN TEKRAR DENEYİNİZ.", fg="yellow", bg="black", font="Helvatica, 14 bold")
            self.warning_tex.pack()

            self.warning_but = Button(self.warning_win, text="TAMAM", command=self.warning_win.destroy)
            self.warning_but.pack()
            

    def delete(self):

        self.girdi1.delete(0,END)
        self.girdi2.delete(0,END)
        self.girdi3.delete(0,END)

app = Application()
mainloop()


2 Beğeni

Treeview vardı, tkinter.ttk’da. Size örnek kullanımını da atayım hatta. Treeview denilen şey de tablo bu arada.

1 Beğeni
1 Beğeni

teşekkür ederim buna bakıyorum hemen

Rica ederim.

Program güzelmiş bu arada. Ben de ne zamandır böyle bir şey yapayım diyordum. Futbol antrenmanlarım için çok işe yarayacak. :wink:

Kilo ve vücut kitle endeksi hesaplayan, bunların kayıt olacağı sonradan çizelge ile takip edebileceğim bir bölüm daha eklemeyi düşünüyorum. Bir çok şey var burada yer alacak. Fakat şuan bu üsttekileri çözeyim. Sonradan yapıcam onları.

1 Beğeni

üstte paylaştığınız program süper. Bir çok fikir verdi bana. iyice inceleyeceğim şimdi.

1 Beğeni

@reo

tkinter da pencereye backround image eklemek istiyorum. Bu mümkün mü? Mümkünse nasıl yapabilirim bilginiz varsa yardım eder misiniz?

Forumda daha bugün böyle bir konu gördüm, bulursam atarım.

bende baktım da denk gelemedim. Beklemedeyim teşekkürler. Bir de şu işi çözemedim hala

Ekran açılma fonksiyonuna ekran_durumu isminde bir değişken atayın.Butona tıklandığında bunun açık - kapalı olma durumuna göre davransın.

Valla nasıl olduysa bulamadım. İnternette tkinter bg image diye aratmayı deneyin.

https://stackoverflow.com/questions/10158552/how-to-use-an-image-for-the-background-in-tkinter Bu link işe yarayabilir belki.

1 Beğeni

Fikir vermesi açısından sizinle bir kod paylaşayım. Aşağıdaki kodlara göre toplevel'in oluşmasını sağlayan button, toplevel kapatılana kadar çalışmayacaktır. x işaretine basıp toplevel’ yok edildikten sonra tekrar toplevel'i oluşturabilirsiniz.

import tkinter as tk


def on_closing(toplevel, button):
    button["command"] = lambda: command(button)
    toplevel.destroy()


def command(button):
    button["command"] = lambda: None
    toplevel = tk.Toplevel()
    toplevel.protocol(
        name="WM_DELETE_WINDOW", 
        func=lambda: on_closing(toplevel, button)
    )
    

root = tk.Tk()

button = tk.Button(master=root, text="Button")
button["command"] = lambda: command(button)
button.pack()

root.mainloop()

biraz stil ekleyebilirsin veya tkinter yerine PyQt5 gibi daha özelleştirilebilir GUI frameworkleri kullanabilirsin :slight_smile: (çünkü sade widgetlar pek göze hitap etmiyor ama gene de sen bilirsin :smiley: )


Açıkcası eline sağlık zaten en iyi program herhangi birinin işine yarıyan programdır :wink:

evet. bu işimi gördü. teşekkür ederim. kendi programıma uyarlayacağım.

bu söz güzelmiş beğendim.

nedense tkinter’ı daha çok seviyorum. İlginç bir duygu. Biraz daha tkinter projesi yaptıktan sonra onu da öğrenirim inşallah

1 Beğeni

bence hiç zaman harcama PyQt5 kadar iyi değil

1 Beğeni

PIL modülünü yüklemem gerekiyor. Fakat şöyle bir hata alıyorum

pil yerine python3 için olan pillow`u indir