GUI для Python с помощью EasyGUI">

Блог gigimon'а

Написание GUI для Python с помощью EasyGUI

Хочу начать по-тихоньку переводить некоторые полезные статьи относящиеся к компьютерах. Как проба пера, хочу перевести небольшую инструкцию по использованию EasyGui. Объективная, не грубая критика принимается в комментариях.

В большинстве случаев, для создания графического интерфейса используют библиотеку Tkinter, либо аналогичную другую. Чаще всего, это делают люди обладающие достаточным опытом программирования на Python, т.к. требуется достаточно много сложного кода. К счастью, модуль EasyGUI добавляет возможность быстро и легко написать качественный GUI для вашего скрипта. Используя EasyGUI, требуется всего лишь несколько строк, для создания визуальных элементов.

Лучший путь изучения EasyGUI раскрывается при использовании его с уже существующим скриптом. Данный пример будет строиться на создании GUI интерфейса к программе Pygmynote - простой менеджер информации, созданный для личного использования, записи заметок, ссылок. Хотя Pygmynote и не сложен в использовании, добавим к нему несколько строчек ввода, сделающие его более легким для управления записями.

Перед началом работы, надо установить EasyGUI. Скачайте последнюю версию с официального сайта, распакуйте полученный архив и перенесите файл easygui.py в директорию /usr/lib/python2.5/site-packages. Для импортирования модуля EasyGUI используйте в своем скрипте строчку (в начале скрипта)

from easygui import

Теперь можно приступать к изучению.

Для начала создадим окно приветствия программы Pygmynote, которое будет встречать пользователей при запуске с помощью всплывающего окна MessageBox. Функция msgbox требует всего-лишь один обязательный параметр, текст сообщения:

msgbox("Pygmynote is ready.")

Помимо этого, у нее есть еще три параметра, которые можно использовать для задания различных функций сообщения: заголовок (box title), подпись кнопки (the button label) и картинку. Вы можете использовать последний параметр для выделения окна с помощью .gif рисунка. Пример окна со всеми тремя параметрами:

image = "pygmynote.gif"
msgbox("Pygmynote is ready.", "Pygmynote", ok_button="Pile up!", image=image)

Для более легкого использования Pygmynote, можно создать меню со списком, содержащее все команды. Пользователь сможет выполнить эту команду выбрав ее из списка и нажав на кнопку “Ok”, или с помощью двойного клика по выбранной команде. Чтобы это сделать, можно использовать EasyGui’s choicebox функции. Также как и msgbox, checkbox имеет три параметра: сообщение (the choicebox’s message), заголовок (the window title), и список опций (a list of options):

msg ="What's your favorite fruit?"
title = "Fruity"
choices = ["Apple", "Apricot", "Pineapple"]
choice = choicebox(msg, title, choices)

Когда пользователь выберет один из параметров и нажмет на кнопку “Ok” (или двойной клик на выбраном), то функция вернет имя выбранного элемента. Чтобы создать choicebox для Pygmenot, надо в список добавить параметры программы:

msg ="Select command and press OK"
title = "Pygmynote"
choices = ["Help", "Insert new record", "Show all records", "Quit"]
command = choicebox(msg, title, choices)

Если вы сейчас запустите скрипт, то увидите окно choicebox с отсортированным по алфавиту содержимым. Почему EasyGUI не соблюдает порядок установки параметров? Чтобы этого избежать, надо использовать такую запись: “1 - Insert new record” или “X - Quit”.

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

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

Используя функцию textblock можно отобразить множество строк в приятном text box. Чтобы это создать, вам надо немного изменить код возвращающий каждую найденую запись в виде строки. Используйте result_list = [] для создания пустого списка, и метод .append для добавления в него записей:

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)

EasyGui’s 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("What do monkeys like most?", "Pygmynote", ["Bread", "Bananas"]):
    msgbox ("Well, not really.")
else:
    msgbox ("Yep, that's what they like most.")

В нашем случае, вы можете использовать функцию boolbox для показа диалогового окна с двумя кнопками выбора “Note” или “Tag”, и перенаправления на обработку этого выбора:

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

Для создания imput box только с числовыми вариантами, можно использовать функцию integerbox. В параметры функции можно задать верхний и нижний диапазон. Для примера, можно модифицировать часть скрипта Pygmynote отображающего календарь с месяцами от 1 до 12:

inputmonth=integerbox(msg='"Month (1-12): "', title='Pygmynotes', default='', argLowerBound=1, argUpperBound=12)

Также, EasuGUI предлагает функцию diropenbox, которая показывает dialog box выбора директории. Вы можете добавить эту функцию в часть скрипта Pygmynote для выбора пути сохранения всех записей 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("%st%st[%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 не может заменить полнофункциональные библиотеки для создания интерфейсов, такие как TKinter, WxPython, GTK+, QT, но является замечательным средством для создания интерфейсов простых скриптов новичками.

Ссылки: первоисточник

Официальный сайт EasyGUI

Скрипт Pygmynote

EasyGui tutorial

2008 — 2014