2011-03-10 52 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成爲你自己的循環的一個迭代。