我试图通过处理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()
我缺少什么,这里?
答案 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()
代码中有一个特定的检查,如果发生真正的变化,它会有意识地决定发送事件。