什么时候需要在Tkinter应用程序中调用主循环?

2024-06-16 11:09:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我看过的每一个tkinter教程都声称,必须调用tkinter.mainloop才能绘制窗口和处理事件,而且它们总是调用此函数,即使在hello world程序中也是如此。但是,当我在交互式shell中尝试这些功能时,窗口将正确绘制,而不必调用mainloop。This example在tkinter中嵌入matplotlib图形会生成一个相对复杂的应用程序,其中有用于在tkinter窗口中平移、缩放和调整绘图大小的按钮,而且,如果删除对mainloop的调用并在交互式shell中运行代码,这一切都会正常工作。当然,如果我在交互shell之外运行脚本(删除mainloop),程序会很快结束,看不到发生了什么,但是如果我添加一个调用input来保持程序打开,一切正常(我在linux上运行python 3.2.2)。

那么mainloop具体做什么,什么时候需要调用它呢?

编辑: 为了澄清,如果我打开GNOME终端并键入

$python3
>>> import tkinter
>>> root = tkinter.Tk()

窗口立即出现而不必调用mainloop,更复杂的tkinter功能似乎也能工作(例如,向窗口添加按钮)。空闲时,需要调用mainloop。我的理解是,在调用mainloop之前,不应该绘制任何内容,也不应该处理任何事件。


Tags: 函数程序功能helloworldtkinterexample绘制
3条回答

主要问题的答案是,当您准备好让应用程序运行时,必须只调用一次mainloop。

mainloop只不过是一个类似这样的无限循环(这些不是方法的实际名称,这些名称只是用来说明这一点):

while True:
    event=wait_for_event()
    event.process()
    if main_window_has_been_destroyed(): 
        break

在这种情况下,“事件”意味着用户交互(鼠标点击、按键等)和工具箱或操作系统/窗口管理器请求绘制或重绘小部件。如果循环没有运行,则不会处理事件。如果事件没有得到处理,屏幕上将不会显示任何内容,除非您运行自己的无限循环,否则您的程序可能会退出。

那么,为什么不需要交互地调用它呢?这只是一个方便,因为否则一旦调用mainloop就不可能输入任何命令,因为mainloop运行到主窗口被破坏为止。

执行代码时,如果没有mainloop函数,tkinter窗口将拒绝打开。

例如,这不起作用:

from tkinter import*
root=Tk()

然而,这将起作用:

from tkinter import*
root=Tk()
root.mainloop()

将带有交互式GUI的程序与计算第一百个Fibonacci数的程序进行比较。所有后一个程序都必须按照从上到下的顺序经历一系列步骤。步骤集和它们的顺序可以提前知道,并且无论您运行程序多少次,它都将保持不变。

但是GUI程序是不同的:在任何给定的时刻,它必须能够处理各种不同的事件和交互。这个需求通常是使用一个称为事件循环的编程构造来实现的。事件循环是程序的中央控制结构。它等待事件发生,然后分派适当的处理程序。

你没有提到你在使用哪个交互shell,但我猜它是空闲的。IDLE本身是一个Tkinter程序,它已经有了一个事件循环。因此,您在shell中键入的Tkinter代码可能绑定到IDLE的事件循环。

相关问题 更多 >