Каждые пару месяцев я встречаю тему, автор которой спрашивает, как ему переключаться между панелями в wxPython приложении, над которым он работает. Так как это довольно распространённый вопрос: за прошлую неделю меня 3 раза спрашивали об этом на моём IRC-канале, я написал короткий скрипт, выполняющий данную задачу.
Учтите, что в большинстве случаев пользователь сочтёт полезным лишь один из массы виджетов для ноутбука. Но, в любом случае, давайте научимся сделать это.
Есть вопросы по 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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
import wx import wx.grid as gridlib class PanelOne(wx.Panel): """""" def __init__(self, parent): """Constructor""" wx.Panel.__init__(self, parent=parent) txt = wx.TextCtrl(self) class PanelTwo(wx.Panel): """""" def __init__(self, parent): """Constructor""" wx.Panel.__init__(self, parent=parent) grid = gridlib.Grid(self) grid.CreateGrid(25,12) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(grid, 0, wx.EXPAND) self.SetSizer(sizer) class MyForm(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, wx.ID_ANY, "Panel Switcher Tutorial") self.panel_one = PanelOne(self) self.panel_two = PanelTwo(self) self.panel_two.Hide() self.sizer = wx.BoxSizer(wx.VERTICAL) self.sizer.Add(self.panel_one, 1, wx.EXPAND) self.sizer.Add(self.panel_two, 1, wx.EXPAND) self.SetSizer(self.sizer) menubar = wx.MenuBar() fileMenu = wx.Menu() switch_panels_menu_item = fileMenu.Append( wx.ID_ANY, "Switch Panels", "Some text") self.Bind(wx.EVT_MENU, self.onSwitchPanels, switch_panels_menu_item) menubar.Append(fileMenu, '&File') self.SetMenuBar(menubar) def onSwitchPanels(self, event): """ Хэндлер события, который запускается при переключении панелей """ if self.panel_one.IsShown(): self.SetTitle("Panel Two Showing") self.panel_one.Hide() self.panel_two.Show() else: self.SetTitle("Panel One Showing") self.panel_one.Show() self.panel_two.Hide() self.Layout() # Запускает программу if __name__ == "__main__": app = wx.App(False) frame = MyForm() frame.Show() app.MainLoop() |
Код, который нас интересует, размещён в хэндлере события onSwitchPanels. Здесь мы используем условное выражение, чтобы проверить какая панель сейчас отображается, а затем скрываем её, чтобы отобразить вторую панель. Мы также задаём название окна, чтобы дать пользователю знать, какая панель сейчас отображается.
Также нам нужно вызвать метод панели под названием Layout(), чтобы сделать панели видимыми. В обратном случае, вы можете столкнуться со странными аномалиями отображения. Например, в панели не будет ничего отображаться до тех пор, пока вы значительно не измените её размер.
Итоги
Теперь вы знаете как переключатся между панелями. Если вы планируете добавить много визуальных элементов, вроде добавления и удаления виджетов, вам стоит обратить внимание на методы Freeze и Thaw, а уже затем запускать метод Layout. Они помогут избавиться от мерцания, которое может возникнуть в результате модифицирования дочерних панелей.
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»