Опубликован: 22.12.2005 | Доступ: свободный | Студентов: 18566 / 672 | Оценка: 4.18 / 3.71 | Длительность: 16:16:00
ISBN: 978-5-9556-0109-0
Лекция 12:

Создание приложений с графическим интерфейсом пользователя

Графическое приложение на Tkinter

Теперь следует рассмотреть небольшое приложение, написанное с использованием Tkinter. В этом приложении будет загружен файл с графическим изображением. Приложение будет иметь простейшее меню File с пунктами Open и Exit, а также виджет Canvas, на котором и будут демонстрироваться изображения (опять потребуется пакет PIL):

from Tkinter import *
                import Image, ImageTk, tkFileDialog
                global img, imgobj

                def show():
                   global img, imgobj
                   # Запрос на имя файла
                   filename = tkFileDialog.askopenfilename()
                   if filename != ():  # Если имя файла было задано пользователем
                     # рисуется изображение из файла
                     src_img = Image.open(filename)
                     img = ImageTk.PhotoImage(src_img)
                     # конфигурируется изображение на рисунке
                     c.itemconfigure(imgobj, image=img, anchor="nw")

                tk = Tk()
                main_menu = Menu(tk)       # формируется меню
                tk.config(menu=main_menu)  # меню добавляется к окну
                file_menu = Menu(main_menu)  # создается подменю
                main_menu.add_cascade(label="File", menu=file_menu)
                # Заполняется меню File
                file_menu.add_command(label="Open", command=show)
                file_menu.add_separator()  # черта для отделения пунктов меню
                file_menu.add_command(label="Exit", command=tk.destroy)

                c = Canvas(tk, width=300, height=300, bg="white")
                # готовим объект-изображение на рисунке
                imgobj = c.create_image(0, 0)
                c.pack()

                tk.mainloop()

Приложение (с загруженной картинкой) будет выглядеть так:


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

from Tkinter import *
                import Image, ImageTk, tkFileDialog

                class App(Tk):
                  def __init__(self):
                    Tk.__init__(self)
                    main_menu = Menu(self)
                    self.config(menu=main_menu)
                    file_menu = Menu(main_menu)
                    main_menu.add_cascade(label="File", menu=file_menu)
                    file_menu.add_command(label="Open", command=self.show_img)
                    file_menu.add_separator()
                    file_menu.add_command(label="Exit", command=self.destroy)

                    self.c = Canvas(self, width=300, height=300, bg="white")
                    self.imgobj = self.c.create_image(0, 0)
                    self.c.pack()

                  def show_img(self):
                     filename = tkFileDialog.askopenfilename()
                     if filename != ():
                       src_img = Image.open(filename)
                       self.img = ImageTk.PhotoImage(src_img)
                       self.c.itemconfigure(self.imgobj, image=self.img, anchor="nw")

                app = App()
                app.mainloop()

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

Примечание:

На некоторых системах новые версии Python плохо работают с национальными кодировками, в частности, с кодировками для кириллицы. Это связано с переходом на Unicode Tcl/Tk. Проблем можно избежать, если использовать кодировку UTF-8 в строках, которые должны выводиться в виджетах.

Заключение

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

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

Виджеты располагаются внутри другого виджета (например, рамки) в соответствии с набором правил. Этот набор правил реализуют менеджеры расположения, которых в Tkinter три: pack, grid и place.

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

Нужно отметить, что для построения интерфейса можно использовать не только чистый Tkinter. Например, в Python доступны модули ScrolledText и Tix, пополняющие набор виджетов. Кроме того, можно найти пакеты для специальных виджетов (например, для отображения дерева).

Построение графического интерфейса невизуальными способами - не такая сложная задача, если использовать Tkinter. Этот пакет входит в стандартную поставку Python и потому может использоваться почти везде, где установлен Python.

Ссылки

Список актуальных ссылок на различные графические библиотеки можно найти по следующему адресу:

http://phaseit.net/claird/comp.lang.python/python_GUI.html

Денис Хохлов
Денис Хохлов

Будет ли адаптация лекций под Python 3?

Арсений Бердюгин
Арсений Бердюгин

скачал с оффсайта последнюю версию python под windows. запускаю примеры из лекции и оно ругается на синтаксис.

Синтаксис примеров в лекции не актуален?
 

Марина Дайнеко
Марина Дайнеко
Россия, Moscow, Nope, 2008
Иван Сельченков
Иван Сельченков
Россия