wxpython TextCtrl与无限循环问题

1 投票
3 回答
1010 浏览
提问于 2025-04-16 13:28

TextCtrl在无限循环中不工作,不知道为什么,这是我的代码:

   while 1:
        localtime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        i = i + 1
        #print str(i)

        serRead = ser.readline()
        serSplit = serRead.split(",")

        #this works
        print str(i)+', '+tempOrShock+', '+localtime+', '+serSplit[1]

        #this doesn't
        self.displayTextCtrl.WriteText(str(i)+', '+tempOrShock+', '+
                                        localtime+', '+serSplit[1])

这个无限循环是在一个按钮点击事件里,也就是说,当我点击按钮后,它就会进入一个无限循环,然后让我TextCtrl不停地输出内容,但它并没有正常工作。不过,打印语句是可以正常运行的。你知道这可能是什么原因吗?

3 个回答

3

你可能应该使用 wx.Timer,而不是无限循环。另一个可以考虑的选项是 wx.Yield。

3

图形用户界面(GUI)程序的工作原理是通过一个无限循环,不断从事件队列中取出事件并执行它们。除了用户产生的事件,比如点击按钮,还有一些低级事件,它们会告诉界面上的小部件(比如按钮、文本框等)自己要怎么绘制。如果这些低级事件没有被处理,即使你修改了它们的属性(比如改变颜色、添加文本等),窗口也不会重新绘制。因为你自己有一个无限循环,这就阻止了这些低级事件的处理。

一个简单的解决办法是,在你自己的循环中从队列中取出事件并处理它们。但因为已经有一个无限循环在运行(也就是“事件循环”),更好的办法是不要自己写一个无限循环。相反,可以使用 wx.CallAfterwx.CallLater 来添加一些工作,这些工作会在低级事件处理完后执行(也就是说,当GUI处于“空闲”状态时)。

实际上,每次调用 wx.CallAfter 就相当于你自己循环中的一次迭代。

6

我觉得wxpython在它的主循环中需要处理一些事情,比如分发事件等等。但是在你从事件处理函数返回之前,这个循环是无法运行的。所以,你可能更好地选择设置一个定时器,定期更新你的文本控件。

撰写回答