所有 tkinter 函数在程序启动时运行

Posted

技术标签:

【中文标题】所有 tkinter 函数在程序启动时运行【英文标题】:All tkinter functions run when program starts 【发布时间】:2012-02-22 20:01:15 【问题描述】:

我在使用 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()

【问题讨论】:

【参考方案1】:

删除命令定义中的()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)

【讨论】:

【参考方案2】:
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)

【讨论】:

感谢您的回复!我没有意识到实际上调用了该函数。问题解决了!

以上是关于所有 tkinter 函数在程序启动时运行的主要内容,如果未能解决你的问题,请参考以下文章

在 Tkinter 中执行函数期间程序冻结

如何增加 Checkbutton 的大小 - Tkinter

使用 Tkinter 在 GIF 中播放动画 [重复]

Python & Tkinter -> 关于调用冻结程序的长时间运行函数

Python图形用户界面

带有 pyserial RS232 的微型开关在 tkinter 线程中启动/停止计时器,但即使停止也继续运行