在我的简单测试中,我有一个来自IpAddrCtrl
的wx.lib.masked
元素:
import wx
import wx.lib.masked as masked
class MainWindow(wx.Frame):
def __init__(self, parent, title):
wx.Frame.__init__(self, parent, title=title, size=(500,500))
self.ipaddr1 = masked.IpAddrCtrl(self, -1, style=wx.TE_PROCESS_TAB)
self.grid_ip = wx.FlexGridSizer(cols=2, vgap=10, hgap=10)
self.grid_ip.Add(self.ipaddr1, 0, wx.ALIGN_LEFT)
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.sizer.Add(self.grid_ip, 0, wx.ALIGN_LEFT | wx.ALL, border=5)
self.SetSizer(self.sizer)
self.Bind(wx.EVT_TEXT, self.OnIpAddrChange, id=self.ipaddr1.GetId())
self.Show(True)
def OnIpAddrChange(self, event):
print(self.ipaddr1.GetAddress())
print(self.ipaddr1.IsValid())
if __name__ == '__main__':
app = wx.App(False)
frame = MainWindow(None, "IpAddrCtrl sample")
app.MainLoop()
在应用程序启动后,我尝试在IpAddrCtrl
元素中插入正确的数字值,但是它带有以下日志:
<BaseMaskedTextCtrl: . . . >
False
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/wx-3.0-gtk2/wx/lib/masked/maskededit.py", line 3016, in _OnChar
keep_processing = self._keyhandlers[key](event)
File "/usr/lib/python2.7/dist-packages/wx-3.0-gtk2/wx/lib/masked/maskededit.py", line 3937, in _OnChangeField
self._AdjustField( pos )
File "/usr/lib/python2.7/dist-packages/wx-3.0-gtk2/wx/lib/masked/maskededit.py", line 4291, in _AdjustField
newfield = field._AdjustField(slice)
File "/usr/lib/python2.7/dist-packages/wx-3.0-gtk2/wx/lib/masked/maskededit.py", line 1649, in _AdjustField
intStr = str(long(intStr))
ValueError: invalid literal for long() with base 10: '.'
这里是screencast它实际上是如何工作的。
wxPython项目中的类似demo对我造成了同样的问题。
我的环境:来自官方稳定存储库的Debian Stretch with Python 2.7.13
,wxPython 3.0.2
和GTK2 2.24.31-2
。
有什么建议吗?感谢您的帮助!
更新:我尝试在Win32平台上使用相同的示例,IpAddrCtrl
没有任何问题。经过一些调试后,我发现尝试编辑选定的文本区域时EVT_TEXT
中发生的其他IpAddrCtrl
事件调用中GTK / Win版本的差异。这将导致不必要的_OnTextChange
事件处理程序调用,从而中断了输入。wxPython Wiki上的这种奇怪行为described和commented的基类来源中的IpAddrCtrl
,但目前尚不知道如何解决它。
这是一个可怕的控件,据我所知,根本无法直观地发挥作用。在输入IP地址的每个部分时,您必须按back space
清除该字段,否则它会完全陷入混乱。替换行
ipaddr = self.FindWindowById(event.GetId())
print ipaddr
print ipaddr.IsValid()
with
print (self.ipaddr1.GetAddress())
print (self.ipaddr1.IsValid())
显然,这是一个需要工作的函数,因为它在wxpython 4中也为broken
。