2011-03-10 53 views
1

TextCtrl不工作,这是我的代码:wxPython的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语句工作正常。任何想法为什么这可能是这种情况?

回答

6

我怀疑的wxPython有它需要做的(调度事件等等)在其主循环进行一些处理。但是,直到你从你的事件处理程序返回,该循环无法运行。你可能会更好地设置定时器来定期更新文本控件。

+0

我敢肯定,循环工作,因为“打印”语句的工作。 'readline()'方法每秒返回一个值,因此每行打印一行。你是什​​么意思设置一个计时器?你可以请扩展一下吗?我仍然很新的这一切.. – lamba 2011-03-10 23:14:08

+0

@lamba:你的循环工作,但wxPython中有一个[事件循环(http://en.wikipedia.org/wiki/Event_loop)正被耽误了你循环。只要循环停止,GUI就不会更新。您的按钮事件应该可能启动一个计时器,并且该计时器的事件处理程序可以更新文本控件。我对wxpython不是很有经验,但是我找到了[示例](http://www.blog.pythonlibrary.org/2009/08/25/wxpython-using-wx-timers/)。看看是否有帮助。 – 2011-03-10 23:25:12

+0

谢谢!我会仔细看看的。 – lamba 2011-03-10 23:30:38

3

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

+0

谢谢,我会研究wx.Timer – lamba 2011-03-10 23:20:17

3

GUI程序由具有一个无限循环,拉断事件队列,并且执行他们的工作。除了用户生成的事件(例如按下按钮)之外,还有一些低级别事件可以指示小部件绘制自己。除非这些事件得到处理,否则即使修改其属性(如更改颜色,添加文本等),窗口也不会重新绘制。因为你有自己的无限循环,所以你正在阻止这些低级事件被处理。

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

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