wxPython in Action. Глава 9. Возможность выбора. Диалоги. (часть 2)

9.2 Использование стандартных диалогов

Практически все операционные системы содержат свои стандартные диалоги для таких повседневных задач, как выбор файла, шрифта или цвета. Это позволяет придерживаться во всех приложениях некоего стандартного внешнего вида и облегчает пользователю работу с вашей программой. Благодаря wxPython Вы тоже можете воспользоваться этим преимуществом; более того, Вы сможете использовать эти диалоги даже на тех платформах, где они не предоставляются операционной системой.

9.2.1 Диалог выбора файла

Диалог выбора файлов обычно стандартный для всех приложений. Класс wx.FileDialog использует родные диалоги для тех систем, где они предусмотрены и свой собственный вид там, где их нет. Версия такого диалога для Windows изображена на рисунке 9.6
рис 9.6
Вы можете указать каталог по умолчанию и маски файлов для отображения, как это сделано в листинге 9.6:

Листинг 9.6

import wx
import os
if __name__ == "__main__":
app = wx.PySimpleApp()
wildcard = "Python source (*.py)|*.py|"
"Compiled Python (*.pyc)|*.pyc|"
"All files (*.*)|*.*"
dialog = wx.FileDialog(None, "Choose a file", os.getcwd(),
"", wildcard, wx.OPEN)
if dialog.ShowModal() == wx.ID_OK:
print dialog.GetPath()
dialog.Destroy()
Диалог выбора файла является одним из наиболее сложных, так как имеет несколько свойств, доступных для чтения / записи. Часть этих свойств Вы можете установить при создании экземпляра этого класса:
wx.FileDialog(parent, message=»Choose a file», defaultDir=»», defaultFile=»», wildcard=»*.*», style=0, pos=wx.DefaultPosition)
message содержит заголовок диалога, defaultDir указывает на каталог, который будет отображён при открытии диалога. Если он не указан или установлен на несуществующий каталог, то будет показано содержимое рабочего каталога. defaultFile содержит название файла и обычно используется при сохранении файлов. wildcart устанавливает фильтры файлов, доступных для выбора, причём в нем можно использовать шаблоны * и ?. В аргументе может содержаться как один шаблон, например *.py, так и набор шаблонов в таком формате: <описание> | <шаблон> | <описание> | <шаблон>, как в листинге выше:
«Python source (*.py)|*.py|Compiled Python (*.pyc)|*.pyc| All files (*.*)|*.*»
Если Вы используете набор шаблонов, то они будут доступны через выпадающий список, как на рисунке 9.6. И ещё, нет никакой гарантии, что аргумент pos будет учитываться конкретной ОС.

Выбор файла

Два наиболее важных флага стиля для данного диалога — это wx.Open и wx.Save, которые определяют поведение диалогового окна.
Диалог, используемый для открытия файла может содержать ещё два флага стиля, а именно wx.HIDE_READONLY, не позволяющий открыть файл в режиме «только для чтения», и wx.MULTIPLE, который позвол
яет выбрать несколько файлов в одной директории.
Для диалога сохранения есть один полезный флаг — wx.OVERWRITE_PROMT, который требует подтверждения от пользователя при его попытке перезаписать уже существующий файл.
Другие типы диалога могут использовать флаг wx.CHANGE_DIR. При его наличии выбор файла изменяет директорию по умолчанию для этого диалога на директорию, содержащую этот файл. Так что в следующий раз открытый диалог уже будет находиться в той директории и для этого Вам не надо сохранять где-либо её название.
В отличие от других диалогов, рассмотренных выше, все эти свойства доступны для чтения и записи при помощи соответствующих методов. Это касается свойств directory, filename, style, message и wildcard, для который существуют соответствующие Get- и Set- методы.
После того, как пользователь закрыл диалог и Вы убедились, что он сделал это кнопкой «ОК», Вы можете получить выбранный им файл с помощью метода GetPath(), возвращающего полное имя и путь к файлу в виде строки. Если Вы использовали флаг wx.MULTIPLE, то Вам потребуется метод GetPaths(), который вернёт Вам список из строк. Если же по какой-то причине Вам надо знать, какой фильтр при этом использовался, то метод GetFilterIndex() вернёт Вам индекс этого фильтра. Для программного изменения выбранного фильтра используйте метод SetFilterIndex().
Кроме того, Вы можете использовать следующую функцию вместо создания экземпляра класса:
wx.FileSelector(message, default_path=»», default_filename=»», default_extension=»», wildcard=»*.*'', flags=0, parent=None, x=-1, y=-1)
Назначение почти всех аргументов понятно из названия, кроме flags — обычно он называется style и default_extension, указывающий на расширение, которое будет добавлено к имени файла при его сохранении. Если пользователь нажимает на «ОК», Вы получите путь к файлу, иначе Вам достанется лишь пустая строка.

Выбор папки

Если Вам надо предоставить пользователю возможность выбора не файла а папки, используйте диалог wx.DirDialog, отображающий древовидную структуру папок, как показано на рисунке 9.7
Вызов этого диалога несколько проще, чем диалога для выбора файла, как видно из листинга 9.7:
рис 9.7

Листинг 9.7

import wx
if __name__ == "__main__":
app = wx.PySimpleApp()
dialog = wx.DirDialog(None, "Choose a directory:",
style=wx.DD_DEFAULT_STYLE | wx.DD_NEW_DIR_BUTTON)
if dialog.ShowModal() == wx.ID_OK:
print dialog.GetPath()
dialog.Destroy()
Практически вся функциональность этого диалога заключена в конструкторе:
wx.DirDialog(parent, message=»Choose a directory», defaultPath=»», style=0, pos = wx.DefaultPosition, size = wx.DefaultSize, name=»wxDirCtrl»)
Поскольку message отображается в самом диалоге, Вам нет необходимости (да по всей видимости и возможности — прим. переводчика) в изменении заголовка диалога. defaultPath указывает выбор по умолчанию, пустая строка в данном случае будет означать корень файловой системы. pos и size игнорируются в Windows, а name игнорируется во всех ОС. Флаг стиля wx.DD_NEW_DIR_BUTTON добавляет кнопку создания новой папки, причём он может не работать в старых версиях Winows.
Свойства path, message и style имеют стандартный методы получения и установки. После закрытия диалога можно получит выбранное значение методом GetPath(). Кроме того, вызвать диалог можно и с помощью функции:
wx.DirSelector(message=wx.DirSelectorPromptStr, default_path=»», style=0, pos=wxDefaultPosition, parent=None)
Аргументы аналогичны конструктору класса. Функция возвращает путь к папке в виде строки или пустую строку, если была нажата кнопка отмены.

9.2.2 Диалог выбора шрифта

Диалог выбора шрифта отличается от диалога выбора файла, та