2014-06-28 47 views
0

我輸出stderr到wx.TextCtrl,10行之後我想刪除第一行,所以在我的wx.TextCtrl窗口中只有最多10行。 我有一個使用多線程和類的python腳本。我只是不能爲我的生活獲得下面的代碼工作,有人可以給我一些提示嗎?wx.TextCtrl GetLineLength wx.CallAfter不工作

a = 1 
while True: 
    line = self.process1.stderr.readline().decode('utf-8') 
    wx.CallAfter(self.frame.running_log1.AppendText, line) 
    if a >= 10: 
     s = wx.CallAfter(self.frame.running_log1.GetLineLength, 0) +1 
     wx.CallAfter(self.frame.running_log1.Remove, 0, s) 
     print s 
    a +=1 

當運行s = None時,失敗。我正在使用wx.CallAfter,因爲我正在使用線程。

+0

你嘗試使用其他功能 - 例如函數'print'在控制檯中查看結果。 – furas

+0

s =無,因此失敗。不知道爲什麼? – speedyrazor

+0

您是否檢查過doc是否'wx.CallAfter()'返回了一些內容。我認爲'wx.CallAfter()'不能返回任何東西。 – furas

回答

1

原因wx.CallAfter返回None是因爲在這一點上沒有任何回報。它不能返回長度,因爲它所做的所有事情都被記錄下來,在某一時刻它需要調用該函數。它實際上並沒有調用函數,並且不會等待函數被調用。

在這種情況下,我會寫一個方法來追加一行並根據需要刪除第一行。這可能看起來像:

def appendAndTrim(self, line): 
     self.frame.running_log1.AppendText(line) 
     self.line_count += 1 
     if self.line_count > 10: 
      first_line_length = self.frame.running_log1.GetLineLength(0) + 1 
      self.frame.running_log1.Remove(0, first_line_length) 

然後我會通過這個單一的方法來wx.CallAfter,而不是進行到wx.CallAfter三個獨立的呼叫:

self.line_count = 0 
while True: 
    line = self.process1.stderr.readline().decode('utf-8') 
    wx.CallAfter(self.appendAndTrim, line) 
+0

優秀的答案和描述,我稍微修改了我的情況。乾杯。 – speedyrazor

+0

這種方法唯一的問題是,在Windows中,當.Remove命令運行並刪除頂行時,wx.TextCtrl窗口跳轉到頂部,所以如果它正在寫入底部然後從頂部刪除,則窗口是不斷地從上到下跳到頂部等等,視覺上並不令人滿意。任何方式來防止這種情況? – speedyrazor

+0

@speedyrazor:如果您在添加新的行之前刪除舊行,它會有所作爲嗎? –