Todas las funciones tkinter se ejecutan cuando se inicia el progtwig

Tengo un problema muy raro que nunca antes había tenido al usar tkinter. En cualquier lugar donde establezca un comando para un widget, como un botón o un elemento de menú, el comando se ejecuta cuando se inicia la aplicación. Básicamente, el comando no espera hasta que se hace clic en el widget para ejecutarse. En mi código, sé que no empaqueté el botón, esto fue para mostrar que el widget ni siquiera tiene que dibujarse en la pantalla para que ocurra este problema. ¿Alguien sabe qué podría estar causándolo? ¡Gracias!

from tkinter import * class menuItems(object): def __init__(self): menubar = Menu(app) filemenu = Menu(menubar, tearoff=0) filemenu.add_command(label="New...", command=self.new()) filemenu.add_command(label="Open...", command=self.open()) filemenu.add_command(label="Save", command=self.save()) filemenu.add_separator() filemenu.add_command(label="Exit", command=app.quit) menubar.add_cascade(label="File", menu=filemenu) app.config(menu=menubar) def new(self): pass def open(self): pass def save(self): print("You have saved the file") def this_should_not_run(): print("Yay! I didn't run!") def this_will_run_even_though_it_should_not(): print("You can't stop me!") def init(): global app, menu app = Tk() app.title("Words with Python") app.geometry("800x500+50+50") menu = menuItems() frame = Frame(app) scrollbar = Scrollbar(frame, orient=VERTICAL) textbox = Text(frame, yscrollcommand=scrollbar.set) scrollbar.config(command=textbox.yview) scrollbar.pack(side=RIGHT, fill=Y) textbox.pack(side=LEFT, fill=BOTH, expand=1) frame.pack(fill=BOTH, expand=1) button = Button(app, text="Nothing", command=this_will_run_even_though_it_should_not()) return init() app.mainloop() 

Elimine los () s en sus definiciones de comando. En este momento, está llamando a la función y vinculando los valores de retorno al parámetro de command , mientras que necesita vincular las funciones para que luego puedan llamarse.

Así que una línea como esta:

 filemenu.add_command(label="New...", command=self.new()) 

En realidad debería ser esto:

 filemenu.add_command(label="New...", command=self.new) 

(Realmente haces esto en un lugar correctamente: filemenu.add_command(label="Exit", command=app.quit) )

 filemenu.add_command(label="Open...", command=self.open()) filemenu.add_command(label="New...", command=self.new()) filemenu.add_command(label="Open...", command=self.open()) filemenu.add_command(label="Save", command=self.save()) 

En estas líneas, tienes que pasar la referencia a las funciones. En realidad estás llamando a las funciones.

 filemenu.add_command(label="Open...", command=self.open) filemenu.add_command(label="New...", command=self.new) filemenu.add_command(label="Open...", command=self.open) filemenu.add_command(label="Save", command=self.save)