На этом занятии
рассмотрим способы создания диалоговых окон. С ними мы с вами уже сталкивались
на предыдущих занятиях, например, когда запрашивали у пользователя какое-либо
дополнительное действие:
Это стандартное
окно, которое создается с помощью класса:
wx.MessageBox(message,
caption=MessageBoxCaptionStr, style=OK|CENTRE, parent=None, x=DefaultCoord,
y=DefaultCoord)
-
message
– сообщение
внутри окна;
-
caption
– заголовок
окна;
-
style – стилизация
окна (в том числе элементами интерфейса);
-
parent – ссылка на
родительский элемент (обычно окно);
-
x, y – координаты
расположения диалогового окна.
Все эти
параметры достаточно очевидны, кроме style. Он может
принимать следующие константы:
Название
|
Описание
|
wx.OK
|
Кнопка «Да» (или «OK»)
|
wx.CANCEL
|
Кнопка «Отмена» (или «Cancel»)
|
wx.YES_NO
|
Кнопки «Да» и «Нет»
|
wx.YES_DEFAULT
|
Фокус на кнопке «Да»
|
wx.NO_DEFAULT
|
Фокус на кнопке «Нет»
|
wx.ICON_EXCLAMATION
|
|
wx.ICON_ERROR
|
|
wx.ICON_HAND
|
|
wx.ICON_INFORMATION
|
|
wx.ICON_QUESTION
|
Иконка вопроса
|
Параметры, относящиеся
к разным цветам, можно между собой комбинировать через битовую операцию ИЛИ (|). Например, мы
можем создать вот такое приложение:
import wx
class MyFrame(wx.Frame):
def __init__(self, parent, title):
super().__init__(parent, title=title, size=(600, 300))
toolbar = self.CreateToolBar()
br_quit = toolbar.AddTool(wx.ID_ANY, "Выход", wx.Bitmap("exit32.png"))
toolbar.Realize()
self.Bind(wx.EVT_TOOL, self.onQuit, br_quit)
def onQuit(self, e):
dlg = wx.MessageBox('Вы дейстительно хотите выйти из программы?', 'Вопрос',
wx.YES_NO | wx.NO_DEFAULT, self)
app = wx.App()
frame = MyFrame(None, 'wxPython')
frame.Show()
app.MainLoop()
Здесь у нас при
нажатии на кнопку тулбара «Выход» показывается это диалоговое окно. В качестве style указали выводить
две кнопки «Да», «Нет» и по умолчанию фокус установили на кнопку «Нет». При
закрытии окна в переменной dlg сохраняется значение константы, которая
может быть равна:
YES,
NO, CANCEL, OK или HELP
Например, ниже
мы можем выполнить такие проверки:
if dlg == wx.YES:
print("Нажата кнопка (да)")
elif dlg == wx.NO:
print("Нажата кнопка (нет)")
Теперь при
нажатии на ту или иную копку, мы увидим соответствующее сообщение в консоли.
MessageDialog
Похожий
функционал предоставляет стандартное диалоговое окно
MessageDialog(parent,
message, caption=MessageBoxCaptionStr, style=OK|CENTRE, pos=DefaultPosition)
Здесь параметры
практически те же самые. Давайте заменим окно MessageBox в нашей
программе на MessageDialog и посмотрим что
произойдет:
dlg = wx.MessageDialog(self, 'Вы дейстительно хотите выйти из программы?', 'Вопрос',
wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
Запускаем
программу, нажимаем на кнопку тулбара, но ничего не происходит. Дело в том, что
здесь строчка wx.MessageDialog(…) лишь создает экземпляр соответствующего
класса, но не вызывает показ окна. Это мы должны сделать самостоятельно,
например, так:
Запускаем, окно
появляется, но нет реакций на кнопки. Это вполне ожидаемо, т.к. переменная dlg теперь не
результат работы диалогового окна, а ссылка на экземпляр класса. Чтобы получить
результат выбора, следует сохранить значение, возвращаемое методом ShowModal:
которое может принимать
значения:
ID_OK,
ID_CANCEL, ID_YES, ID_NO или
ID_HELP
И, далее,
прописать проверки:
if res == wx.ID_YES:
print("Нажата кнопка (да)")
elif res == wx.ID_NO:
print("Нажата кнопка (нет)")
Это кажется
более сложным? Да, но это также дает и больше возможностей управления
диалоговым окном через переменную dlg. Полную информацию о том, как
работать с классом MessageDialog можно посмотреть в официальной документации на
странице:
https://docs.wxpython.org/wx.MessageDialog.html
wx.TextEntryDialog
Следующий класс TextEntryDialog
представляет диалог для ввода текстового значения. Синтаксис его конструктора
следующий:
TextEntryDialog(parent,
message, caption=GetTextFromUserPromptStr, value="",
style=TextEntryDialogStyle, pos=DefaultPosition)
-
parent – ссылка на
родительское окно (если нет, то None);
-
message – сообщение
перед строкой ввода;
-
caption
– заголовок
окна;
-
value – начальное
значение в поле ввода;
-
style
– стиль
окна;
-
pos
– позиция
окна.
Например, его
можно вызвать так:
dlg = wx.TextEntryDialog(self, "Введите имя", "Ввод данных...", "noname")
res = dlg.ShowModal()
if res == wx.ID_OK:
print(dlg.GetValue())
Появляется окно
с текстом «Введите имя» и начальным значением noname. Остальные
параметры берутся по умолчанию. Их возможные значения можно посмотреть в
документации на странице:
https://docs.wxpython.org/wx.TextEntryDialog.html
Все ссылки на
документацию диалоговых окон приведены под этим видео.
wx.DirDialog
Следующий класс DirDialog создает диалог для
выбора каталога:
DirDialog(parent,
message=DirSelectorPromptStr, defaultPath="", style=DD_DEFAULT_STYLE,
pos=DefaultPosition, size=DefaultSize, name=DirDialogNameStr)
-
parent – ссылка на
родительское окно (или значение None);
-
message
– заголовок
окна;
-
defaultPath – начальный
каталог (каталог по умолчанию);
-
style
– стили
окна;
-
pos, size – позиция и
размер окна.
Например, его
можно вызвать так:
dlg = wx.DirDialog(self, "Выбор директории...", "D:",
wx.DD_DEFAULT_STYLE | wx.DD_DIR_MUST_EXIST)
res = dlg.ShowModal()
if res == wx.ID_OK:
print("Выбран каталог: "+dlg.GetPath())
Здесь в качестве
начального каталога указан диск D. Если записать пустую строку, то будет
браться начальный каталог, определяемый ОС. Осталльные параметры, в частности,
стили можно посмотреть на странице документации:
https://docs.wxpython.org/wx.DirDialog.html
wx.FileDialog
С помощью FileDialog создается диалоговое
окно для выбора файла. Его синтаксис такой:
FileDialog(parent, message=FileSelectorPromptStr,
defaultDir="", defaultFile="",
wildcard=FileSelectorDefaultWildcardStr, style=FD_DEFAULT_STYLE,
pos=DefaultPosition, size=DefaultSize, name=FileDialogNameStr)
-
parent – ссылка на
родительское окно (или значение None);
-
message
– заголовок
окна;
-
defaultDir – стартовая
директория;
-
defaultFile – файл,
выбранный по умолчанию;
-
wildcard – селектор для
выбора типов файлов;
-
style
– стилизация
окна;
-
pos, size – позиция и
размер окна.
Я приведу пример
использования данного диалога, взятого из официальной документации:
with wx.FileDialog(self, "Открыть файл...", wildcard="Файлы Питона (*.py)|*.py", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) as fileDialog:
if fileDialog.ShowModal() == wx.ID_CANCEL:
return
pathname = fileDialog.GetPath()
print(pathname)
Здесь
используется менеджер контекста, который проверяет: существует ли выбранный
файл. И в случае возникновения каких-либо проблем появляется сообщение, что
файл не найден. В самом менеджере мы проверяем нажатие на кнопку «Отмена» и
если она была нажата, выполняем оператор return и прерываем дальнейшее
выполнение обработчика. Иначе, берем путь к файлу и отображаем его в консоли.
Документация по
данному диалоговому классу доступна на странице:
https://docs.wxpython.org/wx.FileDialog.html
wx.FontDialog
Следующий диалог
служит для выбора шрифта:
FontDialog(parent, data)
Им можно
воспользоваться вот так:
dlg = wx.FontDialog(self)
res = dlg.ShowModal()
if res == wx.ID_OK:
font = dlg.GetFontData().GetChosenFont() #wx.Font
print(font.GetFaceName())
Смотрите, чтобы
получить данные выбранного шрифта, мы сначала вызываем метод GetFontData, который
возвращает класс wx.FontData и уже с помощью метода GetChosenFont класса FontData
мы получаем ссылку на выбранный шрифт. Далее, с помощью функции print в консоль выводим
имя выбранного шрифта.
Документацию по
данному диалоговому классу можно посмотреть на странице:
docs.wxpython.org/wx.FontDialog.html
Другие стандартные диалоги
На этом занятии
мы лишь рассмотрели примеры использования некоторых стандартных диалогов.
Полный их список, можно посмотреть в документации wxPython. Для этого
нужно зайти вот на эту страницу:
https://docs.wxpython.org/wx.Dialog.html
и здесь в списке
подклассов как раз и будут приведены все типы стандартных диалогов.
Использование их в программах аналогично рассмотренным ранее на этом занятии.