2012-01-31 2 views
2

У меня возникла очень странная проблема, с которой я никогда не сталкивался при использовании tkinter. В любом месте, где я устанавливаю команду для виджета, такого как кнопка или элемент меню, команда запускается при запуске приложения. В основном команда не ждет, пока виджет не будет нажат для запуска. В моем коде я знаю, что я не упаковал кнопку, это должно было показать, что виджет даже не нужно рисовать на экране, чтобы эта проблема возникла. Кто-нибудь знает, что может вызвать это? Благодаря!Все функции tkinter запускаются при запуске программы

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

ответ

12

Удалите () s в своих определениях команд. Прямо сейчас вы вызываете функцию и привязываете возвращаемые значения к параметру command, тогда как вам нужно связать сами функции, чтобы впоследствии их можно было вызвать.

Так линия, как это:

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

должно быть на самом деле это:

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

(Вы на самом деле сделать это в одном месте правильно: filemenu.add_command(label="Exit", command=app.quit))

+0

Спасибо за ответ! Это сделал трюк! – SilverSerpent

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

В этих строках, вы должны передать ссылку на функцию. Вы на самом деле называете функции.

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) 
+0

Спасибо за ответ! Я не понимал, что на самом деле называется функцией. Задача решена! – SilverSerpent