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语句工作正常。知道为什么会这样吗?
答案 0 :(得分:6)
我怀疑wxpython在其主循环中需要进行一些处理(调度事件等)。但是在从事件处理程序返回之前,该循环无法运行。你可能最好设置一个定时器来定期更新你的文本控件。
答案 1 :(得分:3)
你应该使用wx.Timer而不是无限循环。另一个探索的选择是wx.Yield。
答案 2 :(得分:3)
GUI程序通过具有无限循环来工作,该循环将事件从队列中拉出并执行它们。除了用户生成的事件(例如按钮按下)之外,还有一些低级别事件可以告诉小部件自己绘制。除非处理这些事件,否则即使您修改其属性(例如更改颜色,添加文本等),窗口也不会重绘。因为你有自己的无限循环,所以你正在阻止处理这些低级事件。
一个天真的解决方案是,从您自己的循环中将事件从队列中拉出并处理它们。由于已经存在无限循环运行(“事件循环”),更好的解决方案是不编写自己的无限循环。相反,使用wx.CallAfter
或wx.CallLater
添加一旦处理了低级别事件后要执行的工作(即:当GUI处于“空闲”状态时)
实际上,每次调用wx.CallAfter
都会成为您自己循环的一次迭代。