当前位置: 首页 > 知识库问答 >
问题:

如何轻松避免Tkinter冻结?

羊城
2023-03-14

我开发了一个简单的Python应用程序,做了一些工作,然后我决定使用Tkinter添加一个简单的GUI。

问题是,当主函数在做它的事情时,窗口冻结了。

我知道这是一个常见的问题,我已经读到我应该使用多线程(非常复杂,因为函数也更新图形用户界面)或者在不同的函数中划分我的代码,每一个都工作一点时间。无论如何,我不想为这样一个愚蠢的应用程序更改我的代码。

我的问题是:是否有可能没有一种简单的方法可以每秒更新我的Tkinter窗口?我只想应用接吻规则!

我将在下面给出一个伪代码示例,我尝试过但没有成功:

    class Gui:
        [...]#costructor and other stuff

        def refresh(self):
            self.root.update()
            self.root.after(1000,self.refresh)

        def start(self):
            self.refresh()
            doingALotOfStuff()

    #outside
    GUI = Gui(Tk())
    GUI.mainloop()

它只会执行一次刷新,我不明白为什么。

非常感谢你的帮助。

共有3个答案

赵星华
2023-03-14

以下是我是如何解决这个问题的(也许我不知道它有多脏):

每当我通过doingalotofsuff()函数更新我的tkinter窗口时,我调用myTk。更新()

它对我来说避免结冰。

柳修平
2023-03-14

不响应的问题可以避免使用Python中的多线程使用线程模块。

如果您已经定义了任何函数,例如Tkinter窗口冻结的原因是combine(),然后在后台创建另一个函数来启动combine(),如下所示:

import threading
def combine():
    ...

def start_combine_in_bg():
    threading.Thread(target=combine).start()

现在,您必须调用联合(),而不是调用start_combine_in_bg()我这样做了,现在我的窗口没有冻结,所以我在这里分享了它。请记住,一次只能运行一个线程。

查看参考资料:stackoverflow-使用单行多线程代码避免tkinter窗口冻结

韶浩皛
2023-03-14

Tkinter处于main循环中。这基本上意味着它在不断刷新窗口,等待按钮被点击,单词被键入,运行回调,等等。当你在mainloop开启的同一个线程上运行一些代码时,那么在mainloop完成之前,在mainloop上不会执行任何其他操作。一个非常简单的解决方法是将长时间运行的进程派生到单独的线程上。这将仍然能够与Tkinter通信并更新其GUI(大部分情况下)。

下面是一个简单的示例,它不会大幅修改您的psuedo代码:

import threading

class Gui:
    [...]#costructor and other stuff

    def refresh(self):
        self.root.update()
        self.root.after(1000,self.refresh)

    def start(self):
        self.refresh()
        threading.Thread(target=doingALotOfStuff).start()

#outside
GUI = Gui(Tk())
GUI.mainloop()

这个答案详细介绍了mainloop以及它是如何阻止代码的。

下面是另一种方法,它在自己的线程上启动GUI,然后运行不同的代码。

 类似资料:
  • 问题内容: 我开发了一个简单的Python应用程序来做一些事情,然后决定使用Tkinter添加一个简单的GUI。 问题在于,当main函数正在执行其工作时,窗口会冻结。 我知道这是一个普遍的问题,我已经读过我应该使用多线程(非常复杂,因为该函数还会更新GUI)或将我的代码划分为不同的函数,每个函数工作一段时间。无论如何,我不想为这样一个愚蠢的应用程序更改代码。 我的问题是:有没有简便的方法可以每秒

  • 我是python新手,制作了一个Tkinter应用程序,当按下开始按钮时,它将执行目录中存在的所有python文件。我的GUI也有progressbar来查看当前的进度。 这是我的代码 但我的问题是,每当我按下开始按钮,GUI就会冻结,代码开始编译,完成后,GUI就会解冻,Progressbar会立即填满自己。。。 因此,我希望GUI在处理时不要冻结,并在Progressbar上显示正确的进度。

  • 问题内容: 我正在尝试通过从客户端向服务器发送密钥和随机数来认证用户。 我的代码未向我显示客户端的响应。执行下面的代码时,我得到了一个空指针异常。 问题答案: 解决大多数问题的固定步骤: 阅读堆栈跟踪以确定哪一行代码引发NPE 在该行代码处设置一个断点 使用调试器,在遇到断点时,确定该行中的对象引用是 弄清楚为什么引用该文件(到目前为止,这是唯一实际的困难部分) 解决根本原因(也可能很困难)

  • 问题内容: 我有两个简单的Java代码。第一个将恒定功率定义为power = a.pow(b); 第二个将恒定功率定义为power = BigInteger.ONE.shiftLeft(b) 在命令行中设置内存标志- Xmx1024m,第一个代码可以正常工作,但是第二个代码却出现错误:java.lang.OutOfMemoryError:Java堆空间 我的问题:我应该在第二个代码中更改什么以避免

  • 问题内容: 我有一个用于将文本添加到现有.doc文件中的代码,它将通过使用apache POI将其另存为另一个名称。 以下是到目前为止我尝试过的代码 以下是我得到的 我已经添加了与此对应的所有jar文件,但仍然找不到解决方案。我对apache poi是陌生的,所以请帮我提供一些解释和示例。谢谢 问题答案: 从我对问题的评论中复制: 看起来您需要Apache POI发行版中的poi-ooxml-sc

  • 我试图使用Slack自定义命令,但不太确定如何使用延迟消息,因为Yoda Speak外部API需要超过3秒来响应。 我做了以下工作: 在我的例子中发送了slack命令,并收到了. 使用以下内容以下内容发送到响应URL。 null 我仍然得到相同的错误“该死-那个斜杠命令不起作用(错误消息:)。在slash-command管理命令”