Menü üzerindeki checkbutton'a her tıklanıldığında checkbutton'ın yazısını değiştirmek

Merhaba;
Python da oluşturulan help menüsüne ait bir seçeneğe tıkladığımda seçenek adının değişmesini istiyorum.
Örnek: label=“Deneme Text” iken label=“Değiştirildi…” yapmak mümkün mü?
Şimdiden teşekkür ederim.

Kod örneği;

from tkinter import *

root = Tk()
root.geometry("400x300")

class Window(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.master = master
        self.secVar = IntVar()
        self.secVar.set(0)

        self.init_window()

    def init_window(self):
        self.master.title("GUI")
        self.pack(fill=BOTH, expand=1)
        menu = Menu(self.master)
        self.master.config(menu=menu)

        file = Menu(menu, tearoff=0)
        file.add_command(label="Exit", command=self.client_exit)
        menu.add_cascade(label="File", menu=file)

        help = Menu(menu, tearoff=0)
        help.add_command(label="Hakkında...")

        if self.secVar.get() == 0:
            help.add_checkbutton(label="Deneme Text", variable=self.secVar.get(), onvalue=1, offvalue=0,
                                 command=self.text_chanc)
        else:
            help.add_checkbutton(label="Değiştirildi...", variable=self.secVar.get(), onvalue=1, offvalue=0,
                                 command=self.text_chanc)

        menu.add_cascade(label="Help", menu=help)
        """
            Soru: 
                label="Deneme Text" üzerine tıkladığımda bu yazının
                label="Değiştirildi..." şeklinde çıkmasını istiyorum. Bu mümkün mü?

        """

    def text_chanc(self):
        if self.secVar.get() == 0:
            self.secVar.set(1)
        else:
            self.secVar.set(0)
        print(self.secVar.get())# secVar değeri 0 veya 1 olarak değişiyor ancak
                                # help.add_checkbutton.. satırında bu değer daima 1 oluyor.
                                # Menü üzerinde bu değer niçin değişmiyor onu çözemedim.



    def client_exit(self):
        exit()

def mainForm():
    Window(root)
    root.mainloop()

if __name__ == '__main__':
    mainForm()

Merhaba, editörünüzde yazdığınız kodu kopyalayıp burada anlatılan yollardan biriyle buraya aktarabilir misiniz? Veya şurada formatlayıp sonucu buraya tekrar yazabilirsiniz. Gönderiyi edit’leyebilirsiniz veya olmadı bir gönderi daha yazabilirsiniz. Böylelikle size yardım edilme ihtimalini artırabilirsiniz.

1 Beğeni

Çünkü help.add_checkbutton, yani menünüze checkbutton eklediğiniz fonksiyon, init_window metodu içerisinde yer alıyor ve bu metot yalnız bir kere çağrılıyor: en başta Window nesnesi oluşturulurken. Bu metot yine çağrılsaydı bile menü sıfırdan tekrar oluşturulurdu.

Bu istediğiniz metin değişikliğini checkbutton’ın üstüne tıklandığında çağrılan change_text metodunda yapmak gerekir:

def change_text(self):
    if self.secVar.get() == 0:
       self.secVar.set(1)
       yeni_label = "Değiştirildi..."
    else:
        self.secVar.set(0)
        yeni_label = "Deneme Text"

    # Yukarıda if-else ile yeni label'ın ne olacağına karar verdik
    # Şimdi de istenen label'ı gerçekten değiştiriyoruz
    self.help_submenu.entryconfigure(1, label=yeni_label)

Asıl olayı gerçekleştiren satıra yakından bakıyoruz:

self.help_submenu.entryconfigure(1, label=yeni_label)
  • self.help_submenu ile sizdeki şu anda help olarak var olan alt menüye erişiyoruz. Halihazırda nesne tabanlı programlama kullandığınız için self’ten yararlanıyoruz.
  • entryconfigure metodu alt menünün elemanlarını yapılandırmaya yarıyor. İlk argümanı kaçıncı elemanı seçtiğimizi belirtiyor. 0-endeksli olduğu için 1 diyerek sizdeki uygun elemanı seçiyoruz (bu 1’i bir değişkene atamak isteyebilirsiniz veya bu satırın üstüne bir yorum bırakabilirsiniz). Sonra da label=yeni_label diyerek metnini değiştiriyoruz seçtiğimiz elemanın.

Diğer kısımdaki gerekli değişiklikler ise

help = Menu(menu, tearoff=0)

yerine

self.help_submenu = Menu(menu, tearoff=0)

ve sonrasında nerede help varsa ona self.help_submenu diye hitap etmek. help tek başına biraz bulanık bir isim olabilir. (Bu self’lendirme mevzusunu başka değişkenler için de düşünebilirsiniz NTP uğruna.)

if self.secVar.get() == 0:
    help.add_checkbutton(label="Deneme Text", variable=self.secVar.get(), onvalue=1, offvalue=0,
                         command=self.text_chanc)
else:
    help.add_checkbutton(label="Değiştirildi...", variable=self.secVar.get(), onvalue=1, offvalue=0,
                         command=self.text_chanc)

bunun yerine

self.help.add_checkbutton(label="Deneme Text", variable=self.secVar.get(), onvalue=1, offvalue=0,
                          command=self.change_text)

diyoruz çünkü bu init_window’da yer alıyor ve sadece bir kere çalışması planlanıyor. Bu arada çağrılası metodun ismini de change_text diye değiştirdik.

2 Beğeni

Cevap için teşekkür ederim.
Cevabınızı notlarımın arasına kaydedeceğim.
Günler sonra bulduğum çözüm işe yaradı. İşin sırrı, menü seçeneklerinin başına “self.” koymakmış. “text_chanc” e bu kodu daha öncede yazmıştım, ancak “self.” ibaresini koymadığım için hata vermişti.

from tkinter import *

root = Tk()
root.geometry("400x300")

class Window(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.master = master
        self.secVar = IntVar()
        self.secVar.set(0)

        self.init_window()

    def init_window(self):
        self.master.title("GUI")
        self.pack(fill=BOTH, expand=1)

        self.menu = Menu(self.master)
        self.master.config(menu=self.menu)

        self.file = Menu(self.menu, tearoff=0)
        self.file.add_command(label="Exit", command=self.client_exit)
        self.menu.add_cascade(label="File", menu=self.file)

        self.help = Menu(self.menu, tearoff=0)
        self.help.add_command(label="Hakkında...")
        self.help.add_checkbutton(label="Deneme Text", variable=self.secVar.get(), onvalue=1, offvalue=0,  command=self.text_chanc)
        self.menu.add_cascade(label="Help", menu=self.help)

    def text_chanc(self):
        if self.secVar.get() == 0:
            self.secVar.set(1)
            self.help.entryconfigure(1, label="Değiştirildi...")
        else:
            self.secVar.set(0)
            self.help.entryconfigure(1, label="Deneme Text")
        # print(self.secVar.get())

    def client_exit(self):
        exit()

def mainForm():
    Window(root)
    root.mainloop()

if __name__ == '__main__':
    mainForm()