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()