在GTK

时间:2017-11-30 09:35:52

标签: python wxpython wxwidgets wxtextctrl

我的简单测试中有IpAddrCtrl的{​​{1}}元素:

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

这里有一个screencast它是如何运作的。

来自wxPython项目的类似demo会给我带来同样的问题。

我的环境:Debian Stretch with Python <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: '.' ,wxPython 2.7.13和GTK2 3.0.2来自官方稳定的存储库。

有什么建议吗? 谢谢你的帮助!

更新 我尝试在Win32平台上使用相同的示例,2.24.31-2没有任何问题。经过一些调试后,我发现当我尝试编辑所选文本区域时,IpAddrCtrl中发生的额外EVT_TEXT事件调用中GTK / Win版本的差异。这会导致不必要的IpAddrCtrl事件处理程序调用,从而破坏输入。 wxPython wiki上的奇怪行为described_OnTextChange基类源中的commented,但目前还不知道如何修复它。

1 个答案:

答案 0 :(得分:0)

这是一个可怕的控制,据我所知,它根本就没有直观的功能。
您必须按back space清除该字段,因为您输入了IP地址的每个部分,或者它完全变得眩晕。
替换你的行

ipaddr = self.FindWindowById(event.GetId())
print ipaddr
print ipaddr.IsValid()

print (self.ipaddr1.GetAddress())
print (self.ipaddr1.IsValid())

显然,它是一个需要工作的功能,因为它在wxpython 4中也是broken