是否可以在更新期间停止 Tkinter window 冻结?

Is it possible to stop Tkinter window freezing during update?

我有一个小型 python 项目,需要从网络中提取数据并每秒显示一次(这是它更改的频率)以用于科学应用。其中 3 个只是简单的数字,而另一个是 128x128 相机图像,它作为 ndarray 引入并使用 matplotlib 的 imshow 绘制到 tkinter canvas.

我尝试了两种方法 - 使用 aniamtion.FuncAnimation()after(interval, function),两者的结果相同,即在帧更新时,window 不能感动。而且感觉生涩。

我认为这是无法克服的(并且可能无关紧要)?我认为也许多线程可能会有所帮助,所以主 window 在一个线程上,而更新的数据可以在另一个线程上?

谢谢!

下面是现在包含线程的基本代码,关闭 window 时的错误通过向 window 关闭函数添加一个事件来修复,还有一些 break 命令同时获取检查 window 是否关闭的数据 它尝试与不存在的 GUI 项目交互之前。

import blah, blah, blah

global safe_shutdown, window_status, my_thread
safe_shutdown = False
window_status = True

window = tk.Tk()

def widow_close():
    window_status=False
    while True:
        if safe_shutdown == True:
            window.destroy
            return False

def get_updates():
    while True:
        #code to go get data from network

        if window_status == False:
            safe_shutdown == True:
            break

        #more code to place data on the GUI
        if window_status == False:
            safe_shutdown == True:
            break

        #only get updates once a second
        time.sleep(1)

    print "thread complete"

my_thread= threading.Thread(target=get_updates, args=()).start()

window.protocol("WM_DELETE_WINDOW", window_close)
window.mainloop()

我不是专家,所以我不确定是否有更好的解决方案。但我已经成功地使用了两个独立的解决方案:

1:虽然不建议在线程中使用 tkinter 循环,但您可以在线程中使用数据更新 tkinter 应用程序。过去,仅使用线程包,这对我来说效果很好。然后线程将只设置需要刷新的各种内容。

2:调用 window 上的 update_idletasks() 以强制其更新。然后可以将其添加到代码中需要更新视图的不同位置。

解决方案 1 可以解决所有口吃问题,而解决方案 2 可能只会让它好一点。我想这取决于你的实现。