IpAddrCtrl не работает на GTK

У меня есть 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: '.'

Вот скриншот, как это на самом деле работает.

Подобная демонстрация из проекта wxPython вызывает у меня такие же проблемы.

Моя среда: Debian Stretch с Python 2.7.13, wxPython 3.0.2 и GTK2 2.24.31-2 из официальных стабильных репозиториев.

Любые советы? Спасибо за помощь!


Обновление: я пытаюсь использовать тот же образец на платформе Win32, и нет никаких проблем с IpAddrCtrl, После некоторой отладки я обнаружил, что разница в версиях GTK/Win в дополнительном EVT_TEXT вызов события, который происходит в IpAddrCtrl когда я пытаюсь редактировать выделенную область текста. Это вызывает ненужное _OnTextChange вызов обработчика события, который прерывает ввод. Это странное поведение описано в wxPython wiki и прокомментировано в источниках базового класса для IpAddrCtrl, но в настоящее время понятия не имею, как это исправить.

1 ответ

Это ужасный контроль, который, насколько я могу судить, просто не работает интуитивно.
Вы должны нажать back space, чтобы очистить поле, когда вы вводите каждый сегмент IP-адреса, или он попадает в полный приступ.
Замени свои линии

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

с

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

Понятно, что эта функция нуждается в работе, так как она broken в wxpython 4 также.

Другие вопросы по тегам