【问题标题】:IpAddrCtrl is broken on GTKGTK 上的 IpAddrCtrl 已损坏
【发布时间】:2018-05-14 04:25:38
【问题描述】:

在我的简单测试中,我有一个来自 wx.lib.maskedIpAddrCtrl 元素:

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 没有任何问题。经过一些调试后,我发现当我尝试编辑选定的文本区域时,IpAddrCtrl 中发生的额外EVT_TEXT 事件调用中 GTK/Win 版本的差异。这会导致不必要的 _OnTextChange 事件处理程序调用,从而破坏输入。 wxPython wiki 上的 describedIpAddrCtrl 的基类源中的 commented 的奇怪行为,但目前不知道如何修复它。

【问题讨论】:

  • 不知道为什么需要ipaddr = self.FindWindowById(event.GetId())

标签: python wxpython wxwidgets wxtextctrl


【解决方案1】:

这是一个可怕的控件,据我所知,它根本无法直观地运行。
您必须按 back space 清除该字段,因为您输入 IP 地址的每个段,否则它会完全陷入困境。
替换你的行

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

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

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

【讨论】:

  • 感谢您的回复。当然,可以安全地替换 wx demo 中的这些行。看起来我发现了什么破坏了IpAddrCtrl,在 OP 帖子中更新。
猜你喜欢
  • 1970-01-01
  • 2012-04-28
  • 1970-01-01
  • 2013-10-24
  • 1970-01-01
  • 2023-03-20
  • 2021-03-15
  • 2015-11-14
  • 1970-01-01
相关资源
最近更新 更多