我有一个小的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()
答案 0 :(得分:0)
我不是专家,所以我不确定是否有更好的解决方案。但我已经取得了两个独立解决方案的成功:
1:虽然不建议在线程中使用tkinter循环,但是允许您在线程中更新tkinter应用程序的数据。这对我来说非常有用,只需使用线程包。然后线程将设置需要刷新的各种东西。
2:调用窗口上的update_idletasks()以强制它更新。然后可以在代码中的各个位置添加,以便更新视图。
解决方案1可以解决所有口吃问题,而解决方案2可能会让它变得更好。我想这取决于你的实施。