Перевод статьи Dmitri Popov «Dress up your Python scripts with EasyGui». Во многих случаях, добавление графического интерфейса к скриптам Python ведет к тому, что ваши руки будут испачканы при использовании TKinter или другой библиотеки для написания GUI. Обычно последнее используется ограниченным кругом пользователей, тех, кто уже приобрел достаточные навыки программирования на Python, так как это требует некоторого серьезного мастерства. К счастью, модуль EasyGui позволяет вам добавить несколько ценных свойств GUI, без прохождения через бессвязный кодинг. Используя EasyGui, вы сможете добавить визуальные элементы с помощью всего лишь нескольких строк кода. Лучший способ исследовать возможности EasyGui — использовать его, чтобы улучшить существующий скрипт Python. Я использовал его в Pygmynote, который является простой утилитой для управления данных, созданной мной для персонального использования, чтобы хранить ярлыки моих заметок, ссылок и to-do. Хотя Pygmynote не сложен при использовании, добавления нескольких форм ввода данных и диалогов, сделают его ещё проще для ввода и получения записей. Прежде чем вы начнете настраивать скрипт, вам необходимо будет установить EasyGui. Скачайте последний релиз модуля, распакуйте архив и переместите файл easygui.py в директорию /usr/lib/python2.5/site-packages. Чтобы импортировать модуль в ваш скрипт, добавьте строку from easygui import * в начало этого скрипта. Теперь вы готовы к настройке скрипта. Давайте начнем с начала и заменим простое приветствие «Pygmynote is ready. Pile up!» на модное окно сообщения. Функция msgbox принимает, по меньшей мере, один параметр — сообщение для отображения: msgbox("Pygmynote is ready.") Есть три других параметра, которые вы можете указать для функции окна сообщения: заголовок окна, текст на кнопке (по умолчанию «OK») и изображение. Вы можете использовать последний параметр для того чтобы оживить окно сообщения, добавив GIF-изображение на него. Вот пример функции msgbox со всеми доступными параметрами: image = "pygmynote.gif" msgbox("Pygmynote is ready.", "Pygmynote", ok_button="Pile up!", image=image) Чтобы упростить пользователям хранение ярлыков с помощью команд Pygmynote, вы можете добавить список доступных команд. Затем пользователь сможет выполнить желаемую команду путем выбора её из списка и нажатия OK, или просто двойного клика по команде. Чтобы сделать это, вы можете использовать функцию choisebox. Как и msgbox, choisebox принимает три параметра: сообщение, заголовок окна и список опций: msg ="Какой ваш любимый фрукт?" title = "Фрукт" choices = ["Яблоко", "Абрикос", "Груша"] choice = choicebox(msg, title, choices) Когда пользователь выбирает один из элементов списка и жмет OK (или производит двойной клик на элементе), функция возвращает имя этого элемента. Для того чтобы choisebox работала с Pygmynote, вам необходимо будет указать команды скрипта в виде записей списка: msg ="Select command and press OK" title = "Pygmynote" choices = ["Help", "Insert new record", "Show all records", "Quit"] command = choicebox(msg, title, choices) Вам следует также заменить имена команд в блоках условий так, чтобы они соответствовали элементам в choisebox, поэтому command=="n" изменится на command=="Insert new record". Теперь, если вы запустите скрипт, вы увидете, что элементы в списке отсортированы по алфавиту. Но что если хотите, чтобы строка «Insert new record» была первой в списке, или упорядочить все элементы так, как хотите? Пока EasyGui не поддерживает индивидуальной сортировки, вы можете использовать простой прием: поместить цифры или буквы, чтобы привести список к желаемому порядк, например: «1 - Insert new record» или «X - Quit». Следующим шагом является часть Pygmynote, которая показывает список найденных записей. Следующий блок кода показывает все существующие записи: elif command=="a": cursor.execute ("SELECT * FROM notes ORDER BY id ASC") rows = cursor.fetchall () for row in rows: print "\n %s %s [%s]" % (row[0], row[1], row[2]) print "\n Number of records: %d" % cursor.rowcount Используя функцию textbox, вы можете заставить скрипт показывать найденные записи в симпатичном текстовом окне. Чтобы сделать это, вам необходимо изменить указанный блок кода так, чтобы он превращал список найденных записей в строку. Используйте выражение result_list = [], чтобы создать пустой список, а затем метод .append, чтобы добавить записи в него. Затем вы можете использовать сгенерированный список в качестве параметра функции textbox: elif command=="Show all records": cursor.execute ("SELECT * FROM notes ORDER BY id ASC") rows = cursor.fetchall () result_list = [] for row in rows: record_str = "\n%s %s [%s]" % (row[0], row[1], row[2]) result_list.append (record_str) textbox ("Found records:", "Pygmynote", result_list) Функция boolbox может быть полезной для контроля над поведением скрипта. Например, когда вы обновляете запись в Pygmynote, скрипт спрашивает, хотите ли вы обновить текст записи или теги. Затем скрипт обновляет соответствующее поле в записи. Далее следует оригинальный блок кода, который все это выполняет: elif command=="u": input_id=raw_input("Record id: ") input_type=raw_input("Update note (n) or tags (t): ") if input_type=="n": input_update=raw_input("Note: ") sqlstr=escapechar(input_update) cursor.execute ("UPDATE notes SET note='" + sqlstr + "' WHERE id='" + input_id + "'""") else: input_update=raw_input("Tags: ") sqlstr=escapechar(input_update) cursor.execute ("UPDATE notes SET tags='" + sqlstr + "' WHERE id='" + input_id + "'""") print "\nRecord has been updated." Функция boolbox позволяет вам показывать окно сообщения, содержащее две кнопки. Функция возвращает 1, когда пользователь нажимает первую кнопку; в противном случае, она возвращает 0. Вот простой пример того, как это может быть использовано на практике: if boolbox("Что мартышки любят больше?", "Pygmynote", ["Хлеб", "Бананы"]): msgbox ("На самом деле, это не так.") else: msgbox ("Да, вот, что они любят больше всего.") В нашем случае, вы можете использовать функцию boolbox, чтобы предоставить пользователю два варианта: «Note» или «Tags», а затем направить скрипт на соответствующее действие: elif command=="Update record": input_id=enterbox(msg='Record ID: ', title='Pygmynote', default='', strip=True) if boolbox("What do you want to update?", "Pygmynote", ["Note", "Tags"]): input_update=enterbox(msg='Enter note: ', title='Pygmynote', default='', strip=True) sqlstr=escapechar(input_update) cursor.execute ("UPDATE notes SET note='" + sqlstr + "' WHERE id='" + input_id + "'""") else: input_update=enterbox(msg='Enter tags: ', title='Pygmynote', default='', strip=True) sqlstr=escapechar(input_update) cursor.execute ("UPDATE notes SET tags='" + sqlstr + "' WHERE id='" + input_id + "'""") msgbox ("Record has been updated.", "Pygmynote", ok_button="Close") Как следует из названия, функция integerbox отображает окно ввода, куда вы можете ввести только численные значения. Она также позволяет вам указать нижний и верхний пределы для вводимого значения. Например, вы можете изменить часть скрипта Pygmynote, которая отображает календарь так, чтобы она предлагала пользователю ввести номер месяца от 1 до 12: inputmonth=integerbox(msg='"Month (1-12): "', title='Pygmynotes', default='', argLowerBound=1, argUpperBound=12) EasyGui также предоставляет функцию diropenbox, которая отображает окно выбора директории. Вы можете использовать эту функцию в части скрипта Pymynote, чтобы дать возможность пользователю сохранять все записи в текстовый файл pygmynote.txt. Оригинальный блок кода сохраняет файл в директории скрипта, но, используя diropenbox, вы легко можете дать пользователю возможность выбрать любую другую директорию: elif command=="Save all records as pygmynote.txt": cursor.execute ("SELECT * FROM notes ORDER BY id ASC") rows = cursor.fetchall () filedir = diropenbox(msg="Select directory", title="Pygmynote", default=None) filename = filedir + os.sep + "pygmynote.txt" if os.path.exists(filename): os.remove(filename) for row in rows: file = open(filename, 'a') file.write("%s\t%s\t[%s]\n" % (row[0], row[1], row[2])) file.close() msgbox ("Records have been saved in the pygmynote.txt file.", "Pygmynote", ok_button="Close") EasyGui не заменит полноценных наборов для разработки GUI, вроде TKinter или wxPython, но станет хорошим выбором для новичков в Python и программистов, желающих сделать свои скрипты дружелюбными для пользователей без лишней суеты. Если вы хотите попробовать EasyGui, внимательно прочитайте пособие по EasyGui, которое содержит описания остальных доступных функций. |
Статьи с такими же тегами: — Построение парсеров с рекурсивным спуском на Python. |