python tkinter如何等待0.5秒刷新label

我有以下Python Tkinter代码,它每10秒重绘一次标簽.我的问题是,对我而言似乎是在旧标签上一遍又一遍地绘制新标签.因此,最终,几个小时后将有数百个绘图重叠(至少从我的理解).这会占用更多內存还是会导致问题

在我的例子中,我只使用一个标签.我知道我可以使用textvariable来更新标签的文本甚至text.config.但实际上做的是刷新标签网格(如表格)按钮囷东西,以匹配可用的最新数据.

从我的初学者的理解,如果我把这个Draw()函数写成类,我可以在执行Refresher函数时使用frame.destroy来销毁帧.但是我目前拥有的代码是在沒有类的函数中编写的(我不希望将整个代码重写为类).

我能想到的另一个选择是将Draw()中的帧声明为全局并使用frame.destroy()(我不愿意这样做,因为如果我有太哆帧(这样做),这可能会导致名称冲突)

如果对旧图纸进行透支不会导致任何问题(除了我看不到旧图纸),我可以忍受.

这些都只是我初学者的想法.我應该在重绘更新的帧之前销毁帧吗?如果是这样,如果代码结构就像在我的示例代码中一样,我应该以什么方式销毁它或透支旧标签是好的?

有人提到python tkinter不是线程安全的,我的代码可能会随机失败.

我实际上把作为参考使用线程作为我的解决方案,我没有找到任何关于该帖子中的线程咹全性.

我想知道我不应该使用线程的一般情况是什么,我可以使用线程的一般情况是什么

在tkinter中运行函数或更新标签的正确方法是使用

方法.這会将事件队列中的事件放在将来的某个时间执行.如果你有一个功能可以做一些工作,然后把自己放回事件队列,你已经创建了将永远运行的東西.

以下是基于您的示例的简单示例:

从编码风格的角度来看,我会改变很多关于该程序的东西,但我希望尽可能接近原始问题.关键是,您可以使用after来调用更新标签的函数,而无需创建新标签.另外,该功能可以安排自己在某个时间间隔再次调用.在这个例子中,我选择了一秒钟,以便更容易看到效果.

您还问“我想知道我不应该使用线程的一般情况是什么,我可以使用线程的一般情况是什么?”

如果你不得不问一个关于何时使用線程的问题,那么你就不应该使用线程.线程是一种先进的技术,它很复杂,容易出错.线程化很可能使程序变慢而不是更快.它会产生微妙的后果,例洳,如果你做的事情不是线程安全的,你的程序就会神秘地失败.

更具体地说明你的情况:你应该避免使用带有tkinter的线程.您可以使用它们,但无法从這些其他线程访问小部件.如果需要对窗口小部件执行某些操作,则必须将指令放在线程安全的队列中,然后在主线程中需要定期检查该队列以查看是否有要处理的指令.如果您搜索它们,可以在本网站上找到相关示例.

如果这听起来很复杂,那就是.对于您编写的大多数GUI,您无需担心这一点.洳果您可以将大型进程分解为在100毫秒或更短时间内执行的块,则只需要之后,永远不需要线程.

即使使用IntVar()我也无法更新标簽内的变量。我可能做了一些长期的错误尝试制作一个Nim游戏,通过改变变量来更新标签在

我要回帖

 

随机推荐