Панель запуска демонстрации диалогов

panel zapuska demonstracii dialogov Экскурсия по tkinter, часть 1

Пока мы увидели лишь несколько стандартных диалогов, но их число значительно больше. Не станем показывать их на серых снимках с экрана, а напишем на языке Python демонстрационный сценарий, который будет генерировать их по требованию. Ниже приводится один из способов сделать это. Во-первых, напишем модуль, приведенный в примере 8.8, который определяет таблицу соответствий между именами демонстрационных программ и вызовами стандартных диалогов (будем использовать lambda-выражения для обертывания вызовов вызова, если функции диалога нужно передать дополнительные аргументы).

Пример 8.8. PP4E\Gui\Tour\dialogTable.py

# определяет таблицу имя:обработчик с демонстрационными примерами

from

tkinter.filedialog

import

askopenfilename #

импортировать стандартные

from

tkinter.colorchooser

import

askcolor

#

диалоги из Lib\tkinter

from

tkinter.messagebox

import

askquestion,

showerror

from

tkinter.simpledialog

import

askfloat

 

 

demos = {

‘Open’: askopenfilename,

‘Color’: askcolor,

‘Query’: lambda: askquestion(‘Warning’, ‘You typed “rm *”\nConfirm?’), ‘Error’: lambda: showerror(‘Error!’, “He’s dead, Jim”),

‘Input’: lambda: askfloat(‘Entry’, ‘Enter credit card number’)

}

Я поместил эту таблицу в модуль, чтобы использовать ее в качестве основы будущих демонстрационных сценариев (работать с диалогами веселее, чем выводить текст в stdout). Затем напишем сценарий на языке Python, представленный в примере 8.9, который просто генерирует кнопки для всех этих элементов таблицы — использует ее ключи как метки кнопок, а значения как обработчики событий для кнопок.

Пример 8.9. PP4E\Gui\Tour\demoDlg.py

“создает панель с кнопками, которые вызывают диалоги”

from tkinter import * # импортировать базовый набор виджетов

from dialogTable import demos # обработчики событий для кнопок

from quitter import Quitter # прикрепить к себе объект quit

class Demo(Frame):

def __init__(self, parent=None, **options):

Frame.__init__(self, parent, **options)

self.pack()

Label(self, text=”Basic demos”).pack()

for (key, value) in demos.items():

Button(self, text=key, command=value).pack(side=TOP, fill=BOTH)

Quitter(self).pack(side=TOP, fill=BOTH)

if __name__ == ‘__main__’: Demo().mainloop()

Если запустить этот пример как самостоятельный сценарий, он создаст окно, изображенное на рис. 8.11: это панель демонстрационных кнопок, при нажатии которых просто выполняется передача управления в соответствии со значениями в таблице из модуля dialogTable.

Рис. 8.11. Главное окно demoDlg

 

Обратите внимание, что этот сценарий управляется содержимым словаря из модуля dialogTable, поэтому мы можем изменять набор кнопок, изменяя только dialogTable (никакого выполняемого программного кода в demoDlg менять не нужно). Отметьте также, что кнопка Quit является в данном случае прикрепленным экземпляром класса Quitter из предыдущего раздела, причем она скомпонована с теми же параметрами, что и остальные кнопки, — по крайней мере эту часть программного кода уже не нужно будет писать снова.

Кроме всего прочего этот класс обеспечивает передачу любых именованных аргументов **options конструктору своего суперкласса Frame. Хотя в данном примере эта возможность и не используется, тем не менее вызывающие программы могут передавать параметры настройки во время создания экземпляра (Demo(o=v)), вместо того чтобы выполнять настройку позднее (d.config(o=v)). В этом нет особой необходимости, но такая реализация обеспечивает возможность использования класса Demo как обычного виджета фрейма (в чем, собственно, и заключается прием создания подклассов). Позднее мы увидим, как можно использовать эту особенность.

Мы уже видели некоторые диалоги, запускаемые другими кнопками этой демонстрационной панели, поэтому я коснусь здесь только новых.

Например, нажатие кнопки Query генерирует стандартный диалог, изображенный на рис. 8.12.

Этот диалог askquestion выглядит как askyesno, который мы видели раньше, но в действительности возвращает строку yesили no” (askyesno и askokcancel возвращают True или False). Нажатие кнопки Input генерирует стандартный диалог askfloat, изображенный на рис. 8.13.

Рис. 8.12. Запрос demoDlg, диалог askquestion

 

 

Рис. 8.13. Ввод demoDlg, диалог askfloat

 

Прежде чем вернуть управление, этот диалог автоматически проверяет введенные данные на соответствие синтаксису записи чисел с плавающей точкой; он является представителем группы диалогов ввода одного значения (помимо askinteger и askstring, предлагающих ввести целое число и строку). Он возвращает введенные данные как объект числа с плавающей точкой (а не строку) при нажатии кнопки OK и клавиши Enter, либо объект Python None, если пользователь щелкнет на кнопке Cancel. Два родственных ему диалога возвращают объекты целого числа и строки.

При нажатии кнопки Open мы получаем стандартный диалог открытия файла, создаваемый вызовом функции askopenfilename и изображенный на рис. 8.14. Это внешний вид в Windows 7 — в Mac OS, Linux и в более старых версиях Windows этот диалог может выглядеть совершенно иначе.

Рис. 8.14. Открытие файла в demoDlg, диалог askopenfilename

 

Аналогичный диалог выбора имени сохраняемого файла создается вызовом функции asksaveasfilename (пример можно найти в разделе, посвященном виджету Text, в главе 9). Оба файловых диалога дают пользователю возможность перемещаться по файловой системе для выбора нужного имени файла, которое возвращается вместе с полным путем к файлу при нажатии кнопки Open; если была нажата кнопка Cancel, возвращается пустая строка. Оба диалога поддерживают дополнительные протоколы, не показанные в этом примере:

     Им можно передать именованный аргумент filetypes — группу шаблонов имен для выбора файлов, появляющихся в раскрывающемся списке в нижней части диалога.

     Им можно передать параметры initialdir (начальный каталог), initialfile (для поля ввода File name), title (заголовок окна диалога), defaultextension (расширение, добавляемое, когда у выбранного файла нет расширения) и parent (для отображения в виде встроенного дочернего элемента, а не всплывающего диалога).

     Можно заставить их запомнить последний выбранный каталог путем использования экспортированных объектов вместо этих вызовов функций — эту особенность мы будем использовать в последующих примерах.

В модуле filedialog, в библиотеке tkinter, имеется еще один часто используемый диалог, вызываемый функцией askdirectory, который может использоваться, чтобы дать пользователю возможность выбрать каталог. Он выводит структуру каталогов в виде дерева — пользователь может перемещаться по этому дереву и выбирать нужный ему каталог. Эта функция принимает именованные аргументы, включая initialdir и title. Для сохранения имени последнего выбранного каталога, который будет автоматически открыт при следующем вызове диалога, можно использовать соответствующий объект Directory.

Большинство из этих интерфейсов позднее будут использованы в книге, особенно для реализации диалогов выбора файлов в приложении PyEdit, в главе 11, но вы можете, забежав вперед, узнать дополнительные подробности прямо сейчас. Диалог выбора каталога будет показан в примере приложения PyPhoto, в главе 11, и в примере приложения PyMailGUI, в главе 14 — опять же, вы можете забежать вперед, чтобы посмотреть примеры программного кода и снимки с экрана.

Наконец, кнопка Color вызывает стандартную функцию askcolor, которая генерирует стандартный диалог выбора цвета, изображенный на рис. 8.15.

Рис. 8.15. Выбор цвета в demoDlg, диалог askcolor

 

При нажатии в нем кнопки OK возвращается структура данных, идентифицирующая выбранный цвет, которую можно использовать в любом контексте tkinter, где требуется указать цвет. В нее входят значения RGB и шестнадцатеричная строка цвета (например, ((160, 160, 160), ‘#a0a0a0’)). Подробнее об использовании этого набора будет рассказы-

ваться несколько позже. При нажатии кнопки Cancel диалог возвращает кортеж, состоящий из двух значений None.

Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011

Каталог сайтов Всего.ру
Оцените статью
Секреты программирования
Добавить комментарий