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 также.