当前位置: 首页 > 面试题库 >

我何时需要在Tkinter应用程序中调用mainloop?

徐子石
2023-03-14
问题内容

我见过的每一个tkinter教程都声称tkinter.mainloop必须绘制窗口并处理事件,并且它们总是调用此函数,即使在hello
world程序中也是如此。但是,当我在交互式外壳程序中尝试这些方法时,可以正确绘制窗口,而不必调用mainloop。
这个在tkinter中嵌入matplotlib图形的示例产生了一个相对复杂的应用程序,它具有用于在tkinter窗口内平移,缩放和调整图大小的按钮,而且,如果您删除对mainloop的调用并在交互式shell中运行代码,则所有这些操作均有效。当然,如果我在交互式外壳程序外部运行脚本(删除了mainloop),程序结束得太快了,无法看到会发生什么,但是如果我添加了对input
保持程序打开一切正常(我在linux上运行python 3.2.2)。

那么mainloop到底是做什么的,什么时候需要调用它?

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

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

无需调用mainloop即可立即出现一个窗口,并且更复杂的tkinter功能似乎也可以正常工作(例如,向窗口添加按钮)。在IDLE中,必须调用mainloop。我的理解是,在调用mainloop之前,不应绘制任何内容,也不应该处理任何事件。


问题答案:

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

mainloop 只是一个看起来像这样的无限循环(它们不是方法的实际名称,名称仅用于说明要点):

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

在这种情况下,“事件”表示用户交互(鼠标单击,按键等)以及来自工具包或OS
/窗口管理器的绘制或重新绘制窗口小部件的请求。如果该循环没有运行,则事件不会得到处理。如果未处理事件,则除非您运行自己的无限循环,否则屏幕上将不会显示任何内容,并且您的程序可能会退出。

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



 类似资料:
  • 问题内容: 我有一个使用此函数运行线程的代码示例。我们为什么以及何时需要使用它? 编辑 怎么样来使用类,什么是和? 问题答案: 当您要从非UI线程更新UI时必须使用。例如-如果您想从后台线程更新UI。您也可以将其用于同一件事。 从文档- 在UI线程上运行指定的操作。如果当前线程是UI线程,则立即执行该操作。如果当前线程不是UI线程,则将操作发布到UI线程的事件队列。 句法 - 更新- 如果您要执行

  • 问题内容: 在创建iOS应用时,我确切地知道何时需要致电?我知道这与更新/重绘UI有关。但是,每次更改任何视图时,都需要调用此名称吗? 例如,我需要调用它吗: 以编程方式更改文本字段中的文本之后 更改视图背景时? 当我在viewDidLoad中进行更改时? 在viewDidAppear中怎么样? 有人可以给我一些有关何时使用此方法的一般指导吗? 问题答案: 如果您在UIView的子类中重写draw

  • 问题内容: 我实际上何时需要调用此方法Runtime.getRuntime()。addShutdownHook()以及何时或为何需要关闭应用程序。任何人都可以通过举例说明一下。 谢谢 问题答案: 据我所知,我将在下面进行解释。您可以搜索它并找到很多信息。 将注册一些在程序终止时要执行的动作。您启动的程序以两种方式结束: 主线程(根)结束其运行上下文; 该程序遇到一些意外情况,因此无法继续进行。 如

  • package.json index.js login.html 这些是代码文件。 安装NPM软件包的步骤 当我移除贝娄代码时,它的工作非常完美: 但是使用这段代码,在运行时 正在获取贝娄错误: 应用程序在加载过程中抛出错误 错误:在module._resolveFileName(module.js:470:15)在function.module._resolveFileName(C:\users

  • 我正试图通过pySDL2将SDL2窗口嵌入到Tkinter应用程序中。如何设置pySDL2窗口、渲染器,使渲染或绘图显示在嵌入的帧中? 其他例子已经显示了pyplay,但是我发现我的pyplay版本目前不能正确地与SDL2一起工作。我知道还有其他pyplay的实现试图实现SDL2,但是与SDL2的兼容性对我来说是最重要的。 一个正确工作的例子是Tkinter窗口中的一个帧,该窗口有一个屏幕,当单击

  • 问题内容: 我想在我的Tkinter主窗口中嵌入一个终端。我想有一个终端(基于Bash的终端)可以运行的子窗口。我还希望能够让我的程序与终端交互,至少我想阅读当前的工作目录和/或设置它。 我不知道这是否真的不可能。过去我可以使用Perl / Tk做到这一点,所以也许可以在这里复制它。 我当时使用的代码是这样的: Tk主窗口在哪里。 当然,我完全同意Bryan的观点:尽管我以前从未使用GUI库进行编