什么时候需要在 Tkinter 应用程序中调用 mainloop?[重复]
- 2025-01-10 08:46:00
- admin 原创
- 28
问题描述:
我见过的每个 tkinter 教程都声称tkinter.mainloop
必须调用 才能绘制窗口并处理事件,而且它们总是调用此函数,即使在 hello world 程序中也是如此。但是,当我在交互式 shell 中尝试这些时,窗口可以正确绘制,而无需调用 mainloop。 这个在 tkinter 中嵌入 matplotlib 图形的示例产生了一个相对复杂的应用程序,其中包含用于在 tkinter 窗口中平移、缩放和调整绘图大小的按钮,同样,如果您删除对 mainloop 的调用并在交互式 shell 中运行代码,这一切都会正常工作。当然,如果我在交互式 shell 之外运行脚本(删除了 mainloop),程序结束得太快而无法看到会发生什么,但如果我添加一个调用以input
保持程序打开,一切都会正常工作(我在 linux 上运行 python 3.2.2)。
那么mainloop到底起什么作用,什么时候需要调用它?
编辑:澄清一下,如果我打开 GNOME 终端并输入
$python3
>>> import tkinter
>>> root = tkinter.Tk()
窗口会立即出现,而无需调用 mainloop,更复杂的 tkinter 功能似乎也能正常工作(例如,向窗口添加按钮)。在 IDLE 中,必须调用 mainloop。我的理解是,在调用 mainloop 之前,不应绘制任何内容,也不应处理任何事件。
解决方案 1:
你的主要问题的答案是,当你准备运行你的应用程序时,你必须调用一次且只能调用一次 mainloop。
mainloop
只不过是一个无限循环,大致如下所示(这些不是方法的实际名称,名称仅仅用于说明这一点):
while True:
event=wait_for_event()
event.process()
if main_window_has_been_destroyed():
break
在此上下文中,“事件”既指用户交互(鼠标点击、键盘按下等),也指工具包或操作系统/窗口管理器绘制或重绘小部件的请求。如果该循环未运行,则不会处理事件。如果未处理事件,屏幕上将不会显示任何内容,除非您运行了自己的无限循环,否则您的程序可能会退出。
那么,为什么你不需要以交互方式调用它呢?这只是一种便利,因为否则,一旦你调用它,就不可能输入任何命令,mainloop
因为它会mainloop
一直运行到主窗口被销毁。
解决方案 2:
将具有交互式 GUI 的程序与计算百分之一斐波那契数的程序进行比较。所有后者程序都必须按顺序执行一系列步骤,从上到下。步骤集及其顺序可以提前知道,并且无论您运行程序多少次,它都将保持不变。
但 GUI 程序则不同:在任何给定时刻,它必须能够处理各种不同类型的事件和交互。此要求通常使用称为事件循环的编程结构来实现。事件循环是程序的中央控制结构。它等待事件发生,然后分派适当的处理程序。
您没有提到您正在使用哪个交互式 shell,但我猜它是 IDLE。IDLE 本身是一个 Tkinter 程序,并且它已经有一个事件循环在运行。因此,您在 shell 中输入的 Tkinter 代码可能已绑定到 IDLE 的事件循环。
解决方案 3:
当您执行代码时,如果没有函数,tkinter 窗口将拒绝打开mainloop
。
例如这是行不通的:
from tkinter import*
root=Tk()
但是,这会起作用:
from tkinter import*
root=Tk()
root.mainloop()
解决方案 4:
如果您使用的是 python 交互式 shell,则无需调用 root.mainloop() 函数。但是如果您在文件中编码,假设在 IDLE 中,则需要调用 mainloop() 函数才能使程序按如下方式运行:
from tkinter import *
root = Tk()
# Elements in the GUI must go here eg:
lbl = Label(root, text=“Text”)
lbl.pack()
# At the end of the program, do this:
root.mainloop()
解决方案 5:
具体如下:
from tkinter import *
tk = Tk()
canvas = Canvas(tk, width=500, height=500)
canvas.pack()
canvas.create_line(0, 0, 500, 500)
mainloop()
解决方案 6:
我决定,不再将对 mainloop 的调用直接放在脚本的任何地方,而是将其添加为其中的一部分atexit
- 也就是说,当 Python 解释器决定开始关闭时,它将进入 Tk 的主循环。这样一来,它就无法完成关闭序列,直到用户真正告诉 Tk 退出(例如,在 Mac 上使用 command-Q,或在 Windows 中单击红色 X)。
from Tkinter import Tk
root = Tk()
import atexit
atexit.register(root.mainloop)
似乎没有必要mainloop
从系统命令行调用。Python 解释器即使没有它也会继续运行,因为它正在等待您的进一步输入(直到您运行exit()
)。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理必备:盘点2024年13款好用的项目管理软件