tkinter Menu - einzelne Menüpunkte deaktivieren ?

Fragen zu Tkinter.
Antworten
Phraya
User
Beiträge: 11
Registriert: Dienstag 31. März 2020, 15:13

Hallo

ich bin relativ neu mit Python 3 und habe ein Problem mit dem deaktivieren bz. wieder aktivieren von einzelnen Menu-UNTERpunkten in meinem tkinter Menu.
Also z.B. mochte ich im menu 'File' den Unterpunkt 'Save' deaktivieren:

FILE
Open
Save
...

Ich habe immer wieder Losungen gefunden, die das gesamte 'File' Menu mit allen Unterpunkten deaktivieren, z.B.:

Code: Alles auswählen

menu.entryconfig("File", state="disabled")
das funktioniert, aber wie komme ich an die einzelnen Unterpunkte z.B. 'Save" oder 'Open", etc???

Das einzige was ich hierzu gefunden habe ist das hier:

Code: Alles auswählen

menu[0].entrycget(0, 'label')
menu[0].entryconfigure('Save', state=tk.DISABLED)
menu[0].entryconfigure(0)
aber das bring mit immer folgenden Error:

File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/tkinter/__init__.py", line 1643, in cget
return self.tk.call(self._w, 'cget', '-' + key)
TypeError: can only concatenate str (not "int") to str

Kann irgendwer helfen?
Vielen Dank!
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

Hallo Phraya,

das ist etwas wenig Code, den Du uns zeigst.
Wie die Fehlermeldung schon sagt, wird eine Variable vom Type String erwartet, keine Zahl.

Code: Alles auswählen

menu.entrycget(0,  'label') #Wozu?
menu.entryconfig("Save", state = "disabled")
Gruss
Peter
Phraya
User
Beiträge: 11
Registriert: Dienstag 31. März 2020, 15:13

peterpy hat geschrieben: Dienstag 7. April 2020, 09:23 Hallo Phraya,

das ist etwas wenig Code, den Du uns zeigst.
Wie die Fehlermeldung schon sagt, wird eine Variable vom Type String erwartet, keine Zahl.

Code: Alles auswählen

menu.entrycget(0,  'label') #Wozu?
menu.entryconfig("Save", state = "disabled")
Gruss
Peter

Danke! Ja, die Fehlermeldung verstehe ich inhaltlich, aber wie ich das so machen soll, dass es mit einem String funktioniert ist mir an der Stell leider unklar. Machmal bin ich mir auch nicht ganz sicher, ob es vielleicht (nur) eine Syntaxfrage ist, weil Beispiele, die ich im Internet gefunden habe vielleicht fur Python2 waren und man es in Python3 anders schreiben muss...!?

Aber ich habe das Problem insgesamt gelöst bekommen - mit einer Antwort aus einem anderm Forum (https://python-forum.io/Thread-access-s ... inter-Menu) und so funktioniert jetzt alles wie es soll.

Deshalb hier den Code so wie es bei mir jetzt geht - vielleicht hilft das jemand Anderem irgendwann auch einmal:

(Wenn an dem Code irgendwas nicht richtig ist, oder besser zu lösen ist... bitte gerne anmerken - ich kann das noch nicht beurteilen... stelle nur fest, dass es so endlich funktioniert :-)

Code: Alles auswählen

class MyProgram:
    def __init__(self):
        self.tk = Tk()
         
        self.menu = Menu(self.tk)
        self.tk.config(menu=self.menu)
 
        self.main_menu = Menu(self.menu, tearoff=0)
        self.main_menu .add_command(label="StartScreen")
        self.main_menu .add_command(label="Settings")
        self.main_menu .add_command(label="Exit")
        self.menu.add_cascade(label="Main", menu=self.main_menu )
 
        self.file_menu = Menu(self.menu, tearoff=0)
        self.file_menu.add_command(label="Open")
        self.file_menu.add_command(label="Save")
        self.file_menu.add_command(label="Print")
        self.menu.add_cascade(label="File", menu=self.file_menu)
 
        self.test_menu = Menu(self.menu, tearoff=0)
        self.test_menu.add_command(label="Test")
        self.menu.add_cascade(label="Test", menu=self.test_menu)
 
demo = MyProgram()
demo.file_menu.entryconfigure("Save", state=DISABLED)
 
mainloop()
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

Hallo Phraya,

Wie testet Du deinen Code?

In deinem Beispiel fehlt die Art, wie Du Tk und Menu importierst.

Dann kann das:

Code: Alles auswählen

demo.file_menu.entryconfigure("Save", state=DISABLED)
nicht funktionieren.

Es sollte so heissen:

Code: Alles auswählen

demo.file_menu.entryconfigure("Save",  state="disabled")
Um überhaupt deinen Code zum Laufen zu bringen, sollte er in etwa so aussehen:

Code: Alles auswählen

from tkinter import Tk, Menu

class MyProgram:
    def __init__(self):
        self.tk = Tk()         
        self.menu = Menu(self.tk)
        self.tk.config(menu=self.menu) 
        self.main_menu = Menu(self.menu, tearoff=0)
        self.main_menu .add_command(label="StartScreen")
        self.main_menu .add_command(label="Settings")
        self.main_menu .add_command(label="Exit")
        self.menu.add_cascade(label="Main", menu=self.main_menu ) 
        self.file_menu = Menu(self.menu, tearoff=0)
        self.file_menu.add_command(label="Open")
        self.file_menu.add_command(label="Save")
        self.file_menu.add_command(label="Print")
        self.menu.add_cascade(label="File", menu=self.file_menu) 
        self.test_menu = Menu(self.menu, tearoff=0)
        self.test_menu.add_command(label="Test")
        self.menu.add_cascade(label="Test", menu=self.test_menu)
        self.tk.mainloop()
         
demo = MyProgram()
demo.file_menu.entryconfigure("Save", state='disabled')
Jedoch löst dieser Code dein Problem mit der deaktivierten SAVE Taste nicht.

Ich hab dir ein kleines Beispiel gebaut.

Code: Alles auswählen

from tkinter import Menu, Tk, Frame

class Gui(object):
    def __init__(self):
        root = Tk()
        rahmen = Frame(root, width =300, height = 150, bg = "cyan")
        rahmen.pack()
        self.savemerker = "nicht gespeichert"        
        menuleiste = Menu(rahmen, bg = "white")
        self.filemenu = Menu(master = menuleiste)
        root.configure(menu = menuleiste)
        menuleiste.add_cascade(label = " File ", 
                                               menu = self.filemenu)
        self.filemenu.add_command(label = "Open",
                                   command = self.oeffne)
        self.filemenu.add_command(label = "Save",
                                    command = self.speichere)
        self.filemenu.entryconfig("Save", state = "disabled")
        root.mainloop()        
        
    def oeffne(self):    
        self.savemerker = "gespeichert"              
        if self.savemerker == "gespeichert":             
             self.filemenu.entryconfig("Save", state = "normal")        
        print("geöffnet")    

    def speichere(self):        
        self.savemerker = "nicht gespeichert"
        self.filemenu.entryconfig("Save", state = "disabled")        
        self.tu_irgendetwas()

    def tu_irgendetwas(self):
        print("Die Taste 'speichern' wurde betätigt")        

if __name__ == "__main__":
    start = Gui()
Gruss
Peter
Phraya
User
Beiträge: 11
Registriert: Dienstag 31. März 2020, 15:13

@Peter: Vielen lieben Dank fur die Muhe!!! Das funktioniert gut 😊
Antworten