0

所以在我的 Tcl/Tk 应用程序中,我有一个带有文本变量的标签:

    label .mylabel -textvariable statustext -relief sunken -anchor w

我可以通过使用类似的东西来改变标签的内容set statustext "sponatenous error"

不幸的是,有时更新此变量后会进行一些“繁重的处理”,使 GUI 停顿一段时间(例如,从 Internet 下载文件)。

set statustext "downloading from $url"
download $url

由于事件队列被阻止(至少,我猜是这样),GUI 没有得到任何刷新,label也没有显示我的最新消息。

在开始我的“繁重的过程”之前,有没有办法强制更新标签文本(最好是通过文本变量)?

4

1 回答 1

1

如果您在繁重的处理之前这样做update idletasks,实际的 GUI 更新代码将运行。Tk 是这样工作的,因为实际的 GUI 绘图非常昂贵,这使得它可以有效地进行更新。这是一个非常聪明的设计,让 Tk GUI 看起来超快了 25 年。

在某些情况下,一个完整update的标签是必要的——这可能会导致事件处理重入的各种问题——但更新标签通常可以用更便宜、更不麻烦的变体来完成。如果您的更改不会改变标签的实际大小(这取决于您如何处理整个包含顶层的几何管理,这是一个巨大的话题),则尤其如此。作为提示,当您动态更改标签的文本时,最好不要让 GUI 自行调整大小;否则,这可能会让用户有点迷失方向。

于 2021-02-25T21:46:09.053 回答