每个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()
Run Code Online (Sandbox Code Playgroud)
一个窗口立即出现,而不必调用mainloop,更复杂的tkinter功能似乎也可以工作(例如,向窗口添加按钮).在IDLE中,需要调用mainloop.我的理解是,在调用mainloop之前,不应绘制任何内容,也不应处理任何事件.
Bry*_*ley 47
您的主要问题的答案是,当您准备好运行应用程序时,必须只调用一次mainloop.
mainloop
并不仅仅是一个看起来大致相似的无限循环(那些不是方法的实际名称,这些名称仅用于说明这一点):
while True:
event=wait_for_event()
event.process()
if main_window_has_been_destroyed():
break
Run Code Online (Sandbox Code Playgroud)
在此上下文中,"事件"表示用户交互(鼠标单击,按键等)以及来自工具箱或OS /窗口管理器的绘制或重绘窗口小部件的请求.如果该循环未运行,则不会处理事件.如果事件没有得到处理,屏幕上不会显示任何内容,除非你有自己的无限循环运行,否则你的程序可能会退出.
那么,为什么不需要以交互方式调用它?这只是一个方便,因为否则它是不可能的,一旦你调用输入任何命令mainloop
,因为mainloop
运行,直到主窗口被破坏.
将具有交互式GUI的程序与计算第100个斐波纳契数的程序进行比较.所有后一个程序都必须按顺序从上到下进行一系列步骤.这组步骤及其顺序可以事先知道,无论你运行多少次,它都会保持不变.
但是GUI程序是不同的:在任何给定时刻,它必须能够处理各种不同类型的事件和交互.此要求通常使用称为事件循环的编程构造来实现.事件循环是程序的中央控制结构.它等待事件发生,然后调度适当的处理程序.
你没有提到你正在使用的是哪个交互式shell,但我猜它是空闲的.IDLE本身是一个Tkinter程序,它已经有一个事件循环.因此,您在shell中键入的Tkinter代码可能会绑定到IDLE的事件循环.
归档时间: |
|
查看次数: |
84701 次 |
最近记录: |