Работа с основными элементами управления
Эта глава включает:
- Вывод текста
- Работа с кнопками
- Ввод и отображение чисел
- Предоставление пользователю возможности выбора
Инструментарий wxPython предоставляет множество различных виджетов, включая базовые элементы управления, являющиеся темой этой главы. Мы исследуем начальный набор виджетов, содержащий следующие элементы управления: статический текст, редактируемый текст, кнопки, счетчики (spinners), ползунки (slider), флажки (check box), переключатели (radio button), списки (list box), выпадающие списки (choice), комбинированные списки (combo box) и индикаторы прогресса (gauge). Для каждого виджета мы покажем короткий пример его использования, сопровождаемый описанием важных частей API wxPython.
Вывод текста
Этот раздел начинается с примеров отображения текста на экране, которые содержат используемые Вами в качестве меток стилизованные и простые поля статического текста. Вы также сможете создать текстовые поля для однострочного или многострочного ввода пользователя. К тому же, мы рассмотрим, как выбрать шрифт текста.
Как вывести статический текст?
Возможно, основная задача любого пакета для разработки интерфейса пользователя состоит в рисовании на экране простого текста. В wxPython это выполняется на базе класса wx.StaticText. Рисунок 7.1 отображает статические текстовые элементы.
В wx.StaticText Вы можете изменять выравнивание, шрифт и цвет текста. Отдельный виджет статического текста может содержать многострочный текст, однако, он не может управлять множеством шрифтов или стилей. Для поддержки множества шрифтов или стилей используйте более сложный текстовый элемент управления, например, wx.html.HTMLWindow, описываемый в главе 16. Для того, чтобы отображать множество строк внутри статического текстового поля, включите в него строку с символами новой строки и сделайте элемент достаточно большим, чтобы отображать весь текст. Единственная особенность, которая не видна на рисунке, состоит в том, что окно wx.StaticText никогда не получает и не реагирует на события мыши, и оно никогда не получает фокус ввода.
Рисунок 7.1 Примеры виджетов wx.StaticText с изменением шрифта, выравнивания и цвета
Вывод статического текста
Листинг 7.1 показывает текст программы, соответствующий рисунку 7.1
Листинг 7.1 Базовый пример использования статического текста
1 import wx
2 class StaticTextFrame(wx.Frame):
3 def __init__(self):
4 wx.Frame.__init__(self, None, -1, 'Static Text Example',
5 size=(400, 300))
6 panel = wx.Panel(self, -1)
7 wx.StaticText(panel, -1, "This is an example of static text",
8 (100, 10))
9 rev = wx.StaticText(panel, -1,
10 "Static Text With Reversed Colors",
11 (100, 30))
12 rev.SetForegroundColour('white')
13 rev.SetBackgroundColour('black')
14 center = wx.StaticText(panel, -1,
15 "align center", (100, 50),
16 (160, -1), wx.ALIGN_CENTER)
17 center.SetForegroundColour('white')
18 center.SetBackgroundColour('black')
19 right = wx.StaticText(panel, -1,
20 "align right", (100, 70),
21 (160, -1), wx.ALIGN_RIGHT)
22 right.SetForegroundColour('white')
23 right.SetBackgroundColour('black')
24 str = "You can also change the font."
25 text = wx.StaticText(panel, -1, str, (20, 100))
26 font = wx.Font(18, wx.DECORATIVE,
27 wx.ITALIC, wx.NORMAL)
28 text.SetFont(font)
29 wx.StaticText(panel, -1,
30 "Your text\ncan be split\n"
31 "over multiple lines\n\neven blank ones", (20,150))
32 wx.StaticText(panel, -1,
33 "Multi-line text\ncan also\n"
34 "be right aligned\n\neven with a blank", (220,150),
35 style=wx.ALIGN_RIGHT)
36 if __name__ == '__main__':
37 app = wx.PySimpleApp()
38 frame = StaticTextFrame()
39 frame.Show()
40 app.MainLoop()
41 Конструктор для wx.StaticText идентичен базовым конструкторам wxWidget:
42 wx.StaticText(parent, id, label, pos=wx.DefaultPosition,
43 size=wx.DefaultSize, style=0, name="staticText")
Конструктор для wx.StaticText идентичен базовым конструкторам wxWidget:
Таблица 7.1 показывает назначение его параметров - подобный набор параметров в своих конструкторах имеет большинство виджетов wxPython. За детальным описанием параметров конструктора обращайтесь к обсуждению виджетов в главе 2.
Таблица 7.1 Параметры конструктора wx.StaticText
Параметр |
Назначение |
parent |
Виджет, вмещающий данный статический текст |
id |
Идентификатор wxPython. Для автоматического создания уникального идентификатора необходимо использовать значение -1. |
label |
Текст, который необходимо отобразить |
pos |
Позиция виджета на базе объекта wx.Point или кортеж (tuple) Python |
size |
Размер создаваемого виджета на базе объекта wx.Size или кортеж (tuple) Python |
style |
Флаг стиля |
name |
Имя объекта, используемое при поиске |
В следующем разделе мы подробно обсудим стилевые флаги.
Работа со стилями
Все методы, вызываемые для экземпляров статического текста в листинге 7.1, принадлежат родительскому классу wx.Window; wx.StaticText не определяет каких-либо новых собственных методов. Несколько характерных для wx.StaticText стилевых флагов указаны в таблице 7.2.
Таблица 7.2 Стилевые флаги класса wx.StaticText
Стиль |
Описание |
wx.ALIGN_CENTER |
Центрирует статический текст внутри размерного прямоугольника виджета |
wx.ALIGN_LEFT |
Выравнивание текста виджета слева. Этот стиль установлен по умолчанию. |
wx.ALIGN_RIGHT |
Выравнивание текста виджета справа. |
wx.ST_NO_AUTORESIZE |
Если использован этот флаг, виджет со статическим текстом не будет самостоятельно изменять свои размеры после изменения текста методом SetLabel(). Чтобы сохранять выравнивание, Вам нужно использовать данный стиль вместе с центрированием или выравниванием поля справа. |
Элемент управления wx.StaticText перекрывает метод SetLabel() для изменения своих размеров на основании нового текста, что происходит, если не установлен стиль wx.ST_NO_AUTORESIZE.
При создании однострочного поля статического текста с центрированием или выравниванием справа, Вы должны явно устанавливать в конструкторе размер этого поля. Определение размера сдерживает wxPython от автоматического изменения размеров элемента управления. В wxPython размер по умолчанию соответствует минимальному окружающему текст прямоугольнику. Так как по умолчанию размер текстового поля никак не больше размещенного в нем текста и при отображении выравнивания пустого пространства не образуется, не имеет значения выравнено ли поле слева, справа или по центру. Для того чтобы при выполнении программы изменять текст в виджете динамически без изменения размера поля, установите стиль wx.ST_NO_AUTORESIZE. Это не даёт виджету после изменения текста привести свои размеры к минимальному прямоугольнику. Если статический текст размещается внутри динамической формы, изменение его размера может переместить на экране другие виджеты, отвлекая при этом внимание пользователя.
Другие приёмы вывода текста
Имеются и другие способы размещения статического текста на Вашем экране. Во-первых, можно использовать класс wx.lib.stattext.GenStaticText, который представляет собой видоизмененную Python- реализацию класса wx.StaticText. Он более согласован в кросс-платформенном плане, чем стандартная версия C++, и он принимает события мыши. Он также предпочтителен, когда Вам необходим подкласс при создании собственного статического текстового элемента управления.
Вы можете рисовать текст непосредственно в Вашем контексте устройства при помощи метода DrawText(text, x, y) или метода DrawRotatedText(text, x, y, angle). Последний является простейшим способом вывести текст под углом, хотя имеется также управляющий вращением подкласс GenStaticText. Контексты устройства были кратко рассмотрены в главе 6 и будут рассмотрены более подробно в главе 12.
Перевод: Савицкий Юрий