Прежде чем
переходить к построению конкретных интерфейсов, давайте вначале посмотрим на их
общую структуру в модуле wxPython.
Вверху каждого
окна под заголовком можно размещать меню. Для этого сначала создается панель MenuBar, затем идут вкладки
меню (Menu) и далее,
создаются пункты меню (MenuItem) в каждой из вкладок.
Под меню можно
располагать одну или несколько панелей инструментов. Они создаются с помощью
специального метода окна:
CreateToolBar()
Как именно, мы
рассмотрим позже. Затем, в окне располагаются отдельные элементы интерфейса:
тексты, поля ввода, кнопки, списки и т.п. Они называются виджетами. Располагаться
они могут непосредственно в окне, но обычно формируют, так называемый, Layout (схему), в
который помещают элементы интерфейса. Что это такое и зачем он нужен?
Представьте, что
нам нужно расположить элементы по центру окна или во всю его ширину. Если мы
укажем конкретные размеры и позиции, то при изменении размеров окна у нас
«поплывет» вся разметка. Чтобы этого не происходило как раз и был предложен
механизм под общим названием Layout, который в wxPython реализуется с
использованием панелей и сайзеров:
Panel,
Sizers: (BoxSizer, WrapSizer, GridSizer, FlexGridSizer, GridBagSizer)
Например, класс BoxSizer позволяет
располагать виджеты на панели друг за другом (либо в столбец, либо в строку).
Более детально этот процесс рассмотрим, когда будем говорить о Layout’ах.
Наконец, в самом
низу окна можно создавать статусную строку с помощью виджета StatusBar.
Вот типовой
подход к компоновке элементов интерфейса в окне программы. И чтобы мы могли
модифицировать класс Frame удобнее создать свой собственный
наследуя его от базового Frame, например, вот так:
class MyFrame(wx.Frame):
def __init__(self, parent, title):
super().__init__(parent, title=title)
Мы здесь
объявляем свой конструктор с двумя параметрами: parent и title и, затем,
внутри него вызываем конструктор базового класса, используя функцию super(). Далее, по
программе, мы можем использовать наш класс следующим образом:
app = wx.App()
wnd = MyFrame(None, "Hello World!")
wnd.Show()
app.MainLoop()
Все, запускаем
программу и видим стандартное окно нашего приложения. Позже в этом классе мы
будем прописывать весь необходимый функционал для создания своего собственного
интерфейса.
Конечно, класс Frame – это лишь один
из представителей оконных классов. В wxPython их шесть и они
следующие:
-
PopupWindow – специальный
оконный класс для создания popup меню, списков combobox и других
вспомогательных виджетов подобного рода;
-
ScrolledWindow – используется
для создания окна с прокручиваемым содержимым;
-
Frame – используется
для создания стандартного окна;
-
MDIParentFrame (Multiple
Document Interface) – класс, содержащий дочерние оконные классы (как пример, Photoshop со множеством
открытых документов);
-
MDIChildFrame
– создает окно внутри класса MDIParentFrame;
-
Dialog
– создает
диалоговое окно.
Например,
заменим стандартное окно Frame на MDIParentFrame:
class MyFrame(wx.MDIParentFrame ):
def __init__(self, parent, title):
super().__init__(parent, -1, title)
И, затем,
добавим дочернее окно с помощью класса MDIChildFrame:
menubar = wx.MenuBar()
self.SetMenuBar(menubar)
win = wx.MDIChildFrame(self, -1, "Child Window", size=(200, 150))
win.Show()
Получим вот
такой результат:
Далее, при
создании Layout помимо класса Panel можно
использовать еще такие контейнеры для виджетов:
-
ScrolledWindow – контейнер с
прокручиваемым содержимым;
-
SplitterWindow – контейнер с
разделительной полосой, которую можно перемещать, изменяя размеры
соответствующих содержимых;
-
Notebook – используется
для создания tab-интерфейса
(панель со вкладками).
Ну а базовый
набор виджетов определяется такими классами:
- для
динамических (т.е. их содержимое может меняться):
-
Button
– обычная
кнопка;
-
BitmapButton
– кнопка
с картинкой;
-
ToggleButton
– кнопка
переключатель;
-
SpinButton
– стрелочки
вверх/вниз;
-
RadioButton – радио-кнопка
(кружочек с точкой);
-
CheckBox
– чекбокс
(флажок);
-
TextCtrl
– поле
ввода текста;
-
SpinCtrl – поле ввода со
стрелочками вверх/вниз;
-
ComboBox – выпадающий
список с возможностью ввода значения;
-
Choice – выпадающий
список только с возможностью выбора;
-
Slider
– бегунок;
-
ScrollBar
– скроллинг;
-
Grid
– таблица
(наподобие Excel);
-
RadioBox
– контейнер
для RadioButton;
-
ListBox
– список.
- для
статических:
-
StaticBitmap
– для
статических изображений;
-
StaticBox
– квадратная
рамка;
-
Gauge
– прогресс-бар;
-
StaticText
– простой
текст;
-
StaticLine
– линия.
С ними мы будем
постепенно знакомиться на последующих занятиях и вы увидите общий принцип их
использования и по аналогии сможете применять любые виджеты, доступные в wxPython.