Befehl in der Menüleiste wird schon beim Starten ausgeführt

Fragen zu Tkinter.
Antworten
nobbe75
User
Beiträge: 9
Registriert: Donnerstag 13. März 2014, 14:30

Hallo,
ich habe mir ein Formular erstellt und wollte dieses jetzt noch mit einer Meüleiste ergänzen. Dazu habe ich den folgenden Code eingebaut (Nur ein Auszug, den Kern des Programms habe ich mir gespart).

Code: Alles auswählen

from tkinter import *
from tkinter import messagebox
import menu_functions

class GUI(Frame):
    def __init__(self, mainformular):
        Frame.__init__(self, mainformular, relief=SUNKEN, bd=2)
        self.menubar = Menu(self)
        menu = Menu(self.menubar, tearoff=0)
        self.menubar.add_cascade(label="Datei", menu=menu)
        menu.add_command(label="Neu", command=menu_functions.writedata("Test"))
        menu = Menu(self.menubar, tearoff=0)
        self.menubar.add_cascade(label="Bearbeiten", menu=menu)
        menu.add_command(label="Ausschneiden")
        menu.add_command(label="Kopieren")
        menu.add_command(label="Einfügen")

        try:
            self.master.config(menu=self.menubar)
        except AttributeError:
            self.master.tk.call(master, "config", "-menu", self.menubar)

        # Restlicher Code
      
#Fenster erzeugen 
root = Tk()
root.geometry('1000x800')
fenster = GUI(root)
root.mainloop()
Das Problem ist, das ich beim laden des Programmfensters gleich der Befehl

Code: Alles auswählen

 menu.add_command(label="Neu", command=menu_functions.writedata("Test"))
ausgeführt wird. Danach ist der Menüeintrag Datei/Neu ohne Funktion.

Ich hoffe mir kann jemand erklären was da schief läuft.

Grüße
Nobbe
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

nobbe75 hat geschrieben: Das Problem ist, das ich beim laden des Programmfensters gleich der Befehl

Code: Alles auswählen

 menu.add_command(label="Neu", command=menu_functions.writedata("Test"))
ausgeführt wird. Danach ist der Menüeintrag Datei/Neu ohne Funktion.

Ich hoffe mir kann jemand erklären was da schief läuft.
Du *rufst* die Methode ``writedata`` vom ``menu_functions``-Objekt innerhalb von ``menu.add_command`` bereits auf! Also wird sie auch ausgeführt ;-)

Du willst an der Stelle aber nur die *Methode* übergeben! Der Aufruf soll ja dann erst von Tk aus erfolgen, wenn die Aktion ausgewählt worden ist.

Damit das bei Callables mit Parametern klappt, kannst Du z.B. mit ``partial``-Objekten arbeiten. Wie das geht kannst Du hier im Forum in unzähligen Threads nachlesen. Suche mal nach "Tk" und "partial" - da solltest Du etwas finden.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
nobbe75
User
Beiträge: 9
Registriert: Donnerstag 13. März 2014, 14:30

@Hyperion

Super, gefunden, verstanden (hoff ich :D ), und schon funktionierts.

Vielen Dank
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

nobbe75 hat geschrieben: Vielen Dank
Bitte :D
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten