wxpython TextCtrl和无限循环问题

时间:2011-03-10 21:56:42

标签: python user-interface wxpython infinite-loop

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])

这个无限的while循环在一个按钮点击事件中,我基本上在点击一个按钮后运行一个无限循环,并告诉我的TextCtrl不断写出东西并且它不起作用。但是,print语句工作正常。知道为什么会这样吗?

3 个答案:

答案 0 :(得分:6)

我怀疑wxpython在其主循环中需要进行一些处理(调度事件等)。但是在从事件处理程序返回之前,该循环无法运行。你可能最好设置一个定时器来定期更新你的文本控件。

答案 1 :(得分:3)

你应该使用wx.Timer而不是无限循环。另一个探索的选择是wx.Yield。

答案 2 :(得分:3)

GUI程序通过具有无限循环来工作,该循环将事件从队列中拉出并执行它们。除了用户生成的事件(例如按钮按下)之外,还有一些低级别事件可以告诉小部件自己绘制。除非处理这些事件,否则即使您修改其属性(例如更改颜色,添加文本等),窗口也不会重绘。因为你有自己的无限循环,所以你正在阻止处理这些低级事件。

一个天真的解决方案是,从您自己的循环中将事件从队列中拉出并处理它们。由于已经存在无限循环运行(“事件循环”),更好的解决方案是不编写自己的无限循环。相反,使用wx.CallAfterwx.CallLater添加一旦处理了低级别事件后要执行的工作(即:当GUI处于“空闲”状态时)

实际上,每次调用wx.CallAfter都会成为您自己循环的一次迭代。