实时Tkinter / ttk Entry小部件更新:thread + queue或.after(1)?

时间:2013-04-29 15:09:52

标签: python tkinter real-time ttk

我有一个Tkinter / ttk应用程序,可以分析每10-25毫秒到达的数据包。我目前的实现使用一个线程,在每个套接字读取后更新30个StringVars,然后调用update_idletasks()来更新相应的Entry小部件。我的应用程序在启动后不会超过30分钟崩溃。

搜索显示Tk并非真正的线程安全,我有两个主要选择:

  1. 使用线程+队列。

  2. 使用函数+ .after(1,function)。

  3. UI只是启动/停止更新,并提供Entry小部件以供显示。

    系统中的主要等待是套接字读取,其超时时间是预期的数据包速率的2倍(因此它不能永久阻止)。

    在这种情况下,您更喜欢方法#1还是#2?

    我因为它的简单而倾向于#2,但我不确定是否有任何Tk陷阱在这条路上等着。在我等待社区智慧时,我可能会尝试两种方式。

2 个答案:

答案 0 :(得分:0)

我个人的经验法则是避免线程,除非严格要求。线程增加了复杂性。此外,还有很大一部分程序员不是特别精通线程,因此如果该程序将被其他人使用或维护,则线程会增加风险因素。

话虽如此,在这个特殊情况下,我认为我会选择线程+队列。由于您知道显示器应该更新的频率,因此我会每隔10ms左右设置一次队列轮询以更新窗口小部件。

答案 1 :(得分:0)

我刚刚在原始实现中改变了8行代码,实现了#2(函数+ .after(1,函数)),并且运行完美。所以#2基于简单性和有效性而获胜。它使用3-4%的1核(i5-2500,3.3 GHz)运行

但是如果我的UI变得更复杂,例如通过matplotlib动画添加条带图记录,则可能需要队列和单独的采集线程。但不是今天!

编辑:但是不要使用.after(0,...):当我尝试时,我的用户界面被锁定了。