Tkinter'da onaylama butonu

Merhaba ben tkinter üzerinden yaptığım bir programda onaylama düğmesi oluşturdum ancak düğmeyi nasıl aktif edebileceğimi çözemedim yani şunu istiyorum ben düğmeye basmadıkça kodları çalıştırmasın çünkü her birine kod bağladım ve kodlar çalışıp uygulamayı bozuyor eklediğim seçim kutucuğu sorun çıkarıyor yanlışlıkla basınca uygulama devreye giriyor bunu engellemek istiyorum

Aşağıdaki kodları bir inceleyin isterseniz.

import tkinter as tk

root = tk.Tk()

button = tk.Button(master=root, text="Onayla")
button.pack()


def command():
    # Çalıştırılacak kodlar buraya yazılacak.
    # Mesela düğmeye basıldıktan sonra bir
    # tane entry widgeti oluşturmak istiyor olalım.
    entry = tk.Entry(master=root)
    entry.pack()


button.configure(command=command)

root.mainloop()

Yani başka konularda işimi görüyor evet ancak benim istediğim bu işe yaramaz sanırım şöyle örnek vereyim mesela bir pizza uygulaması yapıyoruz ve uygulamada küçük orta büyük seçeneği var hata ile küçük pizzaya tıklayınca küçük pizza çalışıyor sonradan büyük pizzaya tıklayınca her ikisi birden çalışıyor ben bunu engellemek istiyorum yeni sayılırım ama bu işe yaramıyor sanırım(yarıyorsa lütfen kusura bakmayın)

Yani yanlışlıkla küçük pizza düğmesine tıkladınız, küçük pizza menüsü açıldı. Sonra büyük pizza düğmesine tıkladınız ama açılmış olan küçük pizza menüsü kapanmadı ve büyük pizza menüsü açıldı, sonuç olarak iki tane açık menünüz oldu. Doğru mu anlamışım?

Evet sorun bu ben seçimimden sonra onaylaya basınca işlem gerçekleşsin istiyorum

Böyle durumlarda tk.Checkbutton veya tk.OptionMenu veya tk.Menubutton veya tk.Radiobutton veya ttk.Combobox widgetlerinden birini kullanmanız daha iyi aslında. Aşağıdaki örnekte tk.Checkbutton kullanıldı, inceleyin isterseniz.

import tkinter as tk

toplevel = None


def menu_1_ekrani(toplevel: tk.Toplevel):
    entry = tk.Entry(master=toplevel)
    entry.pack()
    
    
def menu_2_ekrani(toplevel: tk.Toplevel):
    text = tk.Text(master=toplevel)
    text.pack()


def menu_ekrani_ac(secim_degiskeni: tk.StringVar, checkbuttons: dict):
    global toplevel
    if all(not v[1].get() for v in checkbuttons.values()):
        return
    degisken = secim_degiskeni.get()
    if degisken:
        if toplevel:
            toplevel.destroy()
        toplevel = tk.Toplevel()
        toplevel.title(degisken)
        if degisken == "Menü-1":
            menu_1_ekrani(toplevel=toplevel)
        if degisken == "Menü-2":
            menu_2_ekrani(toplevel=toplevel)
    
    
def wrap(func):
    def decorate(*args, **kwargs):
        def call():
            return func(*args, **kwargs)
        return call
    return decorate
    
    
@wrap
def check_uncheck(
        checkbuttons: dict, 
        active: tuple, 
        string: tk.StringVar
):
    for k, v in checkbuttons.items():
        if v != active:
            v[1].set(False)
            v[0].configure(variable=v[1])
        else:
            string.set(k)
    
    
def main():
    root = tk.Tk()

    checkbuttons = {}
    secim = tk.StringVar()
    for i in "Menü-1", "Menü-2":
        variable = tk.BooleanVar()
        checkbutton = tk.Checkbutton(
            master=root, 
            text=i, 
            variable=variable
        )
        checkbutton.pack()
        checkbuttons[i] = checkbutton, variable
    for v in checkbuttons.values():
        v[0].configure(
            command=check_uncheck(
                checkbuttons=checkbuttons, 
                active=v,
                string=secim
            )
        )
        
    onay_dugmesi = tk.Button(
        master=root, 
        text="Onayla", 
        command=lambda: menu_ekrani_ac(
            secim_degiskeni=secim, 
            checkbuttons=checkbuttons
        )
    )
    onay_dugmesi.pack()
    
    root.mainloop()
    
    
main()
1 Beğeni