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

时间:2015-10-27 18:08:52

标签: python-2.7 tkinter tkinter-canvas

我有一个小的python项目,需要从网络中提取数据并为科学应用程序每秒显示一次(这是它改变的频率)。其中3个是简单的数字,而另一个是128x128的摄像机图像,它以ndarray形式引入,并使用matplotlib的imshow绘制到tkinter画布。

我尝试了两种方法 - 使用aniamtion.FuncAnimation()after(interval, function),两者都有相同的结果,即框架更新时,窗口无法移动。它感觉生涩。

我认为这是无法克服的事情(可能并不重要)?我认为也许多线程可能有帮助所以主窗口在一个线程上,而更新的数据可能在另一个线程上?

谢谢!

下面是现在包含线程的基本代码,关闭窗口时的错误是通过向窗口关闭函数添加事件来修复的,还有一些break命令在获取检查是否窗口的数据时在之前关闭,它尝试与不存在的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 个答案:

答案 0 :(得分:0)

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

1:虽然不建议在线程中使用tkinter循环,但是允许您在线程中更新tkinter应用程序的数据。这对我来说非常有用,只需使用线程包。然后线程将设置需要刷新的各种东西。

2:调用窗口上的update_idletasks()以强制它更新。然后可以在代码中的各个位置添加,以便更新视图。

解决方案1可以解决所有口吃问题,而解决方案2可能会让它变得更好。我想这取决于你的实施。