格式化输入时,wx.TextCtrl循环无限

时间:2014-02-21 22:48:11

标签: wxpython

我试图通过处理EVT_TEXT事件来反转在TextCtrl上键入的文本并将其写回组件,但是在第二个字符输入后我得到了一个无限循环。

贝娄,代码:

import wx

class NumberTextCtrl(wx.TextCtrl):
  def __init__(self, *args, **kwargs):
    super(NumberTextCtrl, self).__init__(*args, **kwargs)
    self.Bind(wx.EVT_TEXT, self.OnText)

  def OnText(self, event):
    value = self.GetValue()
    value = value[::-1]
    print "value", value
    self.ChangeValue(value)


class Example(wx.Frame):
  def __init__(self, parent, title):
    super(Example, self).__init__(parent, title=title, size=(300,100)) 
    sizer = wx.BoxSizer(wx.HORIZONTAL)
    text = NumberTextCtrl(self, id=100)
    sizer.Add(text,1,border=5)    

    self.SetSizer(sizer)    
    self.Centre()
    self.Show()

if __name__ == '__main__':
    app = wx.App()
    Example(None, title="Example")
    app.MainLoop()

我缺少什么,这里?

1 个答案:

答案 0 :(得分:0)

看来在Ubuntu下,调用TextCtrl.ChangeValue()会引发一个EVT_TEXT。

你可以这样解决这个问题:

import wx

class NumberTextCtrl(wx.TextCtrl):
  def __init__(self, *args, **kwargs):
    super(NumberTextCtrl, self).__init__(*args, **kwargs)
    self.Bind(wx.EVT_TEXT, self.OnText)

  def OnText(self, event):
    self.Unbind(wx.EVT_TEXT)
    value = self.GetValue()
    value = value[::-1]
    print "value", value
    self.ChangeValue(value)
    wx.CallAfter(self.Bind, wx.EVT_TEXT, self.OnText)


class Example(wx.Frame):
  def __init__(self, parent, title):
    super(Example, self).__init__(parent, title=title, size=(300,100)) 
    sizer = wx.BoxSizer(wx.HORIZONTAL)
    text = NumberTextCtrl(self, id=100)
    sizer.Add(text,1,border=5)    

    self.SetSizer(sizer)    
    self.Centre()
    self.Show()

if __name__ == '__main__':
    app = wx.App()
    Example(None, title="Example")
    app.MainLoop()

但至于为什么会发生这种情况:它看起来像是一个错误。 ChangeValue()当然不应该生成事件。

您是否注意到只有在键入不同的字符时才会出现问题?这显然是因为对ChangeValue()的调用并未导致实际更改。因此,好像在ChangeValue()代码中有一个特定的检查,如果发生真正的变化,它会有意识地决定发送事件。