wx.TextCtrl GetLineLength wx.CallAfter不工作

时间:2014-06-28 20:58:32

标签: python thread-safety wxpython wx.textctrl

我正在将stderr输出到wx.TextCtrl,在10行之后我想删除第一行,所以在我的wx.TextCtrl窗口中最多只有10行。 我有一个使用多个线程和类的python脚本。我不能为我的生活获得下面的代码来工作,有人可以给我一些提示吗?

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。

1 个答案:

答案 0 :(得分: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)