tkinter代码是如何执行的?

时间:2016-03-11 10:41:31

标签: python tkinter

我正在使用tkinter编写程序,但我不明白它是如何工作的。通常,代码是自上而下执行的,但是使用tkinter显然不会。

例如,我将一个函数绑定到鼠标左键,每次单击按钮时都会执行此功能。但其他代码如何处理呢?我的问题是我在程序开始时初始化一个在绑定函数中用作参数的变量,然后在函数中更改并返回。但每次调用该函数时,该变量似乎都会重置为其初始值。

有谁知道这是为什么?

我写的是这样的:

var = "black"
var = c.bind("<Button-1>", lambda event: func(event, arg=var))

函数“func”更改var并返回它,但是下次按下按钮时变量总是“黑色”。

提前致谢!

1 个答案:

答案 0 :(得分:0)

Tkinter确实自上而下。让tkinter与众不同的是它到底时会发生什么。

通常,tkinter程序中的最后一个可执行语句是对根窗口的mainloop方法的调用。说实话,tkinter程序看起来像这样:

# top of the program logic
root = tkinter.Tk()
...
def some_function(): ...
...
some_widget.bind("<1>", some_function)
...
# bottom of the program logic
root.mainloop()

mainloop只是一个相对简单的无限循环。您可以将其视为具有以下结构:

while the_window_has_not_been_destroyed():
    event = wait_for_next_event()
    process_event(event)

程序处于持续等待状态。它等待按钮单击或按键单击等事件,然后处理该事件。从概念上讲,它通过扫描表来处理事件,以查找该事件是否与捕获事件的窗口小部件相关联。如果找到匹配项,则会运行绑定命令到该窗口小部件+事件组合。

当您设置绑定或将命令与按钮关联时,您正在向该表添加内容。你告诉tkinter&#34;如果事件X发生在小部件Y上,则运行功能Z&#34;。

您不能使用返回结果,因为它不是您调用此函数的代码。调用该函数的代码是mainloop,它并不关心函数返回的内容。任何返回的东西都会被忽略。