Стандартные диалоговые окна

На этом занятии рассмотрим способы создания диалоговых окон. С ними мы с вами уже сталкивались на предыдущих занятиях, например, когда запрашивали у пользователя какое-либо дополнительное действие:

Это стандартное окно, которое создается с помощью класса:

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()

Запускаем, окно появляется, но нет реакций на кнопки. Это вполне ожидаемо, т.к. переменная dlg теперь не результат работы диалогового окна, а ссылка на экземпляр класса. Чтобы получить результат выбора, следует сохранить значение, возвращаемое методом ShowModal:

res = 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

и здесь в списке подклассов как раз и будут приведены все типы стандартных диалогов. Использование их в программах аналогично рассмотренным ранее на этом занятии.

Видео по теме