Давным-давно я пытался помочь одному из подписчиков почтовой рассылки wxPython разобраться в том, как использовать виджет сетки (wx.grid.Grid) через XRC. Это должно было быть проще простого, но когда вы запустите код, расположенный ниже, вы столкнётесь со странной проблемой:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
import wx from wx import xrc class MyApp(wx.App): def OnInit(self): self.res = xrc.XmlResource("grid.xrc") frame = self.res.LoadFrame(None, 'MyFrame') panel = xrc.XRCCTRL(frame, "MyPanel") grid = xrc.XRCCTRL(panel, "MyGrid") print(type(grid)) grid.CreateGrid(25, 6) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(grid, 1, wx.EXPAND|wx.ALL, 5) panel.SetSizer(sizer) frame.Show() return True if __name__ == "__main__": app = MyApp(False) app.MainLoop() |
Вы заметите, что после запуска на экране появится “wx._windows.ScrolledWindow” а не объект Grid. Таким образом, Python 2 выдаст вас следующий трейсбек:
1 2 3 4 5 6 7 8 9 10 11 |
AttributeError: 'ScrolledWindow' object has no attribute 'CreateGrid' File "c:\Users\mdriscoll\Desktop\xrcGridDemo.py", line 26, in <module> app = MyApp(False) File "C:\Python26\Lib\site-packages\wx-2.8-msw-unicode\wx\_core.py", line 7981, \ in __init__ self._BootstrapApp() File "C:\Python26\Lib\site-packages\wx-2.8-msw-unicode\wx\_core.py", line 7555, \ in _BootstrapApp return _core_.PyApp__BootstrapApp(*args, **kwargs) File "c:\Users\mdriscoll\Desktop\xrcGridDemo.py", line 14, in OnInit grid.CreateGrid(25, 6) |
Трейсбек в Python 3 довольно схож, поэтому я не буду копировать и его. Вместо этого, мы взглянем на XRC-файл, который мы пытались загрузить в прошлом примере.
1 2 3 4 5 6 7 8 9 |
<?xml version="1.0" ?> <resource class=""> <object class="wxFrame" name="MyFrame"> <object class="wxPanel" name="MyPanel"> <object class="wxGrid" name="MyGrid"/> </object> <title>XRC Grid</title> </object> </resource> |
Как вы видите, вы должны были бы получить wxGrid обратно. Каково решение? Вам нужно импортировать wx.grid! Почитайте вот этот фрагмент темы, чтобы узнать больше. Согласно словам Робина Дана, создателя wxPython, вот почему вам нужно это сделать:
«Вам нужно импортировать wx.grid в ваш код в Python. Когда вы делаете это, некоторые внутренние обновляются посредством типа информации для классов сетки, и эта информация используется когда нужно выяснить, как конвертировать С++ поинтер в объект Python, причём последний должен иметь тип, подходящий возврата значения формата XRCCTRL.»
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Обновлённый код выглядит так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import wx import wx.grid from wx import xrc class MyApp(wx.App): def OnInit(self): self.res = xrc.XmlResource("grid.xrc") frame = self.res.LoadFrame(None, 'MyFrame') panel = xrc.XRCCTRL(frame, "MyPanel") grid = xrc.XRCCTRL(panel, "MyGrid") print(type(grid)) grid.CreateGrid(25, 6) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(grid, 1, wx.EXPAND|wx.ALL, 5) panel.SetSizer(sizer) frame.Show() return True if __name__ == "__main__": app = MyApp(False) app.MainLoop() |
Когда вы запустите этот код, вы увидите следующее:
Так что, если вы столкнётесь со странной проблемой, описанной выше, вы будете знать, как с ней справиться.
Итоги
Создание видежтов XRC может быть достаточно сложным, но это действительно ценный опыт, а именно знания, позволяющие отделить вашу logic от вашего пользовательского интерфейса. В этой статье, мы научились как разобраться с достаточно прямолинейной проблемой. Как вы могли узнать из прошлой статьи, добавление контроля, который ещё не является частью XRC уже немного сложнее.
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»