Аннотация: В этой лекции рассматривается создание простейшего приложения с графическим интерфейсом пользователя. Для построения интерфейса не применяются визуальные средства («построители интерфейса»), а используются возможности графической библиотеки виджетов (Tk).
Обзор графических библиотек
Строить графический интерфейс пользователя ( GUI , G raphical U ser I nterface) для программ на языке Python можно при помощи соответствующих библиотек компонентов графического интерфейса или, используя кальку с английского, библиотек виджетов.
Следующий список далеко не полон, но отражает многообразие существующих решений:
- Tkinter Многоплатформенный пакет имеет хорошее управление расположением компонентов. Интерфейс выглядит одинаково на различных платформах (Unix, Windows, Macintosh). Входит в стандартную поставку Python. В качестве документации можно использовать руководство «An Introduction to Tkinter» («Введение в Tkinter»), написанное Фредриком Лундом: http://www.pythonware.com/library/tkinter/introduction/
- wxPython Построен на многоплатформной библиотеке wxWidgets (раньше называлась wxWindows). Выглядит родным для всех платформ, активно совершенствуется, осуществлена поддержка GL. Имеется для всех основных платформ. Возможно, займет место Tkinter в будущих версиях Python. Сайт: http://www.wxpython.org/
- PyGTK Набор визуальных компонентов для GTK+ и Gnome. Только для платформы GTK.
- PyQT/PyKDE Хорошие пакеты для тех, кто использует Qt (под UNIX или Windows) или KDE.
- Pythonwin Построен вокруг MFC , поставляется вместе с оболочкой в пакете win32all; только для Windows.
- pyFLTK Аналог Xforms, поддержка OpenGL . Имеется для платформ Windows и Unix. Сайт: http://pyfltk.sourceforge.net/
- AWT , JFC , Swing Поставляется вместе с Jython, а для Jython доступны средства, которые использует Java. Поддерживает платформу Java.
- anygui Независимый от нижележащей платформы пакет для построения графического интерфейса для программ на Python. Сайт: http://anygui.sourceforge.net/
- PythonCard Построитель графического интерфейса, сходный по идеологии с HyperCard/MetaCard. Разработан на базе wxPython . Сайт: http://pythoncard.sourceforge.net/
Список актуальных ссылок на различные графические библиотеки, доступные из Python , можно найти по следующему адресу: http://phaseit.net/claird/comp.lang.python/python_GUI.html
ТОП 5 Лучших графических (GUI) фреймворков Python / Графический интерфейс python
Библиотеки могут быть многоуровневыми. Например, PythonCard использует wxPython, который, скажем, на платформе Linux базируется на многоплатформной GUI -библиотеке wxWindows, которая, в свою очередь , базируется на GTK+ или на Motif , а те — тоже используют для вывода X Window. Кстати, для Motif в Python имеются свои привязки.
В лекции будет рассматриваться пакет Tkinter, который по сути является оберткой для Tcl /Tk — известного графического пакета для сценарного языка Tcl . На примере этого пакета легко изучить основные принципы построения графического интерфейса пользователя.
Как быстро сделать графический интерфейс на Python
О графическом интерфейсе
Почти все современные графические интерфейсы общего назначения строятся по модели WIMP — Window, Icon , Menu , Pointer (окно, иконка, меню , указатель ). Внутри окон рисуются элементы графического интерфейса, которые для краткости будут называться виджетами ( widget — штучка). Меню могут располагаться в различных частях окна, но их поведение достаточно однотипно: они служат для выбора действия из набора предопределенных действий. Пользователь графического интерфейса «объясняет» компьютерной программе требуемые действия с помощью указателя. Обычно указателем служит курсор мыши или джойстика, однако есть и другие «указательные» устройства. С помощью иконок графический интерфейс приобретает независимость от языка и в некоторых случаях позволяет быстрее ориентироваться в интерфейсе.
Основной задачей графического интерфейса является упрощение коммуникации между пользователем и компьютером. Об этом следует постоянно помнить при проектировании интерфейса.
Применение имеющихся в наличии у программиста (или дизайнера) средств при создании графического интерфейса нужно свести до минимума, выбирая наиболее удобные пользователю виджеты в каждом конкретном случае. Кроме того, полезно следовать принципу наименьшего удивления: из формы интерфейса должно быть понятно его поведение.
Плохо продуманный интерфейс портит ощущения пользователя от программы, даже если за фасадом интерфейса скрывается эффективный алгоритм . Интерфейс должен быть удобен для типичных действий пользователя. Для многих приложений такие действия выделены в отдельные серии экранов, называемые «мастерами» (wizards).
Однако если приложение — скорее конструктор , из которого пользователь может строить нужные ему решения, типичным действием является именно построение решения. Определить типичные действия не всегда легко, поэтому компромиссом может быть гибрид, в котором есть «мастера» и хорошие возможности для собственных построений. Тем не менее, графический интерфейс не является самым эффективным интерфейсом во всех случаях. Для многих предметных областей решение проще выразить с помощью деклараций на некотором формальном языке или алгоритма на сценарном языке.
Источник: intuit.ru
GUI на Python (Tkinter)
Самый простой способ создания GUI-приложение на python — использование модуля tkinter, который по сути является надстройкой над библиотекой Tk.
Простой пример GUI-программы на python, созданный с помощью Tkinter
Рассмотрим минимальный пример:
from tkinter import Tk, Label root = Tk() label = Label(root, text=’Hello’) label.pack() root.mainloop()
Создание GUI с помощью Tk включает в себя следующие основные шаги:
1) Импорт классов виджета из библиотеки:
from tkinter import Tk, Label
from tkinter import *
2) Создание главного окна:
root = Tk()
3) Создание виджетов и установка их свойств:
label = Label(root, text=’Hello’)
label = Label(root) label[‘text’] = ‘Hello’
4) Определение событий и определение обработчиков событий (при необходимости) посредством метода bind или установки параметра command (для кнопки и меню);
5) Расположение (упаковка) виджетов на родительском окне:
label.pack()
6) Отображение главного окна и запуск цикла событий:
root.mainloop()
Замечания:
Шаг 4 не обязателен в случае размещения пассивных элементов (таких как метки Label), но нужен, если мы хотим обрабатывать нажатие кнопок и т.п.
На самом деле создавать родительское окно (root) было тоже не обязательно, если виджет всего один. Так что этот пример с меткой можно было сократь до
from tkinter import Label label = Label(None, text=’Hello’) label.pack() label.mainloop()
Функция mainloop() запускает цикл обработки событий (посредством «обработного вызова»). Соответственно, чтобы происходили какие-то действия, необходимо зарегистрировать обработчики событий . Есть несколько способов как это сделать.
Обработка нажатий кнопок мыши и клавиш на клавиатуре
Способ 1 — cвойство command
import sys from tkinter import * def quit(): sys.exit() root = Tk() but = Button(root, text=»Press me to exit», command=quit) but.pack() root.mainloop()
Здесь в качестве параметра мы передает ссылку на функцию (метод), а не результат выполнения функции. Поэтому скобки после quit ставить не нужно(!).
Конечно, здесь можно было и сразу написать
Также здесь можно было использовать анонимные функции (т.е. лямбда-выражения):
command = (lambda: sys.exit())
В этом случае скобки после метода уже нужны, что позволяет передавать туда аргументы при необходимости. Однако здесь, как и выше, вызов sys.exit() происходит не в момент создания кнопки, т.е. при выполнения инструкции
but = Button(root, text=»Press me», command=(lambda: sys.exit()))
а в момент нажатия кнопки. Это так называемый отложенный вызов функции , который достигается за счет использования лямбда-выражений.
Способ 2 — метод bind
import sys from tkinter import * def quit(event): sys.exit() root = Tk() but = Button(root, text=»Press me», width=30, height=5, bg=»white»,fg=»blue») but.bind(», quit) but.pack() root.mainloop()
Метод bind связывает между собой 3 базовые компонента событийного программирования: виджет, событие и функцию. Таким образом, общая форма метода bind следующая:
При возникновении события будет вызывать соответствующая функция (обработчик события). В отличие от прежнего способа, здесь функция имеет один параметр event — событие.
Вообще, с помощью bind мы можем привязать к виджету не одно событие, а сразу несколько. Например,
but.bind(‘gt’, quit) but.bind(‘gt’, somefunc)
Некоторые стандартные события, производимые мышью:
— gt — щелчок левой кнопкой мыши
— gt — щелчок средней кнопкой мыши
— gt — щелчок правой кнопкой мыши
— gt — двойной клик левой кнопкой мыши
— gt — движение мыши
События, производимые с помощью клавиатуры
— Буквенные клавиши (например, ‘gt’ или просто ‘Q’).
— Для неалфавитных клавиш существуют специальные зарезервированные слова:
— Сочетания клавиш пишутся через тире:
* gt — одновременное нажатие клавиш Ctrl и Shift.
Они устанавливаются для виджета, на котором в данный момент находится фокус:
root.bind(‘gt’, quit)
Описание некоторых виджетов
Виджет Text
text = Text(root, font=(‘times’,12), width=50, height=15, wrap=WORD) text.bind(‘Q’, quit) text.pack()
Рисование
виджет Canvas
canv = Canvas(root, width=300, height=200, bg=»white», cursor=»pencil») canv.pack() canv.create_line(20,0,100,50, width=1, fill=»green») canv.create_line(0,0,100,100, width=2, fill=»blue», arrow=LAST)
Tk + PIL
Для работы с файлами JPG понадобятся следующие библиотеки:
$ sudo apt-get install python-imaging-tk
$ sudo apt-get install python3-pil.imagetk
затем коде делаем
import PIL from PIL.ImageTk import PhotoImage
Практический пример. Рисование с помощью tkinter графика функции, вычисление значений которой занимает много времени
Часто возникает необходимость запустить какой-то долго длящийся процесс вычислений, но так, чтобы само окно при этом не зависало и кнопки реагировали на нажатия, и при этом результат вычислений выводился в процессе работы программы, чтобы не возникало чувства, что программа зависла. Кроме того, может возникнуть необходимость остановить процесс вычислений при необходимости.
В этом случае проще всего (а возможно и единственный вариант) — запустить отдельный поток, используя модуль _thread либо threading. Следующий пример это демонстрирует (будет работать на python3). Эта программа состоит из двух частей (модулей).
Основной модуль graphic.py (для вывода графика на canvas):
import sys from tkinter import * import _thread from calc import func class Control: bool_stop = False class Graphic: x0 = 0 y0 = 0 def next_point(self, y1): x1 = self.x0 + 2 canv.create_line(self.x0, self.y0, x1, y1, width=2, fill=»red») #canv.update() # not nesessary self.x0 = x1 self.y0 = y1 def add_point_on_graphic(x): gr.next_point(x) def quit(event): sys.exit() def start_calc(): Control.bool_stop = False _thread.start_new_thread(func, (add_point_on_graphic, Control)) def method_stop(): Control.bool_stop = True root = Tk() canv = Canvas(root, width=600, height=200, bg=»white», cursor=»pencil») but = Button(root, text=»Draw», width=30, height=2, bg=»white»,fg=»blue») but[‘command’] = (lambda: start_calc()) but_stop = Button(root, text=»Control», width=30, height=2, bg=»white»,fg=»blue») but_stop[‘command’] = (lambda: method_stop()) but_quit = Button(root, text=»Quit», width=30, height=2, bg=»white»,fg=»blue») but_quit[‘command’] = (lambda: sys.exit()) canv.create_line(0,100,200,100, width=2, fill=»blue», arrow=LAST) gr = Graphic() canv.pack() but.pack() but_stop.pack() but_quit.pack() root.mainloop()
Модуль calc.py для вычисления значения функции func. Эта функция будет запущена в отдельном потоке. При создании потока мы передаем в функцию func ссылку на метод add_point_on_graphic, который добавляет точку на график.
import math import time def func(func_add_point_on_graphic, Control): for i in range(0, 2000): if Control.bool_stop: break func_add_point_on_graphic(math.sin(i/4.0)*20+20) time.sleep(0.05)
Класс Control создан для того, чтобы хранить глобальную переменную bool_stop, что позволяет нашему дочернему потоку узнать, была ли нажата кнопка Stop, останавливающая процесс вычислений.
Конечно, вместо передачи ссылки на функцию func_add_point_on_graphic можно было передать в funш ссылку на экземпляр класса Graphic и через него вызывать метод next_point(x), но здесь продемонстрировал еще один пример.
Библиотека PyQt
PyQt — это набор Python библиотек для создания графического интерфейса на базе платформы Qt от компании Digia.
В настоящий момент (под Python 3) доступна вервия PyQt5.
$ sudo apt-get install python3-pyqt5 pyqt5-dev-tools
#!/usr/bin/python3 import sys from PyQt5.QtWidgets import QApplication, QWidget if __name__ == ‘__main__’: app = QApplication(sys.argv) w = QWidget() w.resize(250, 150) w.move(300, 300) w.setWindowTitle(‘Simple’) w.show() sys.exit(app.exec_())
Источники
Платы ARDUINO
Now 05.07.23 5:21:35, Your IP: 37.78.75.83; spyphy.zl3p.com/python/gui_tk
Источник: spyphy.zl3p.com
Пишем десктоп-приложение на Python с помощью Tkinter
Знакомимся с библиотекой Tkinter — пишем на Python кросс-платформенный калькулятор, который рассчитывает вес человека.
Иллюстрация: Merry Mary для Skillbox Media
Антон Яценко
Изучает Python, его библиотеки и занимается анализом данных. Любит путешествовать в горах.
Десктопные приложения пишут на разных языках программирования: C++, C#, C, Python и других. Начинающим разработчикам проще всего использовать Python и его библиотеки для работы над графическими интерфейсами.
Одна из таких библиотек — Tkinter. Она входит в стандартный пакет Python и позволяет создавать приложения для Windows, mac OS и Linux. Давайте разберёмся, как устроена эта библиотека, и напишем десктопный калькулятор, помогающий рассчитать вес человека.
Что такое GUI и как с ним работать в Python
GUI (Graphical User Interface) — это графический интерфейс пользователя, оболочка программы, с которой мы взаимодействуем с помощью клавиатуры и мыши. На современных операционных системах почти все программы работают с графическим интерфейсом, и мы каждый день сталкиваемся с GUI: читаем статьи в браузере, набираем текст в редакторе или играем в игры.
Противоположность графическому интерфейсу — командная строка, позволяющая управлять приложением с помощью текстовых команд. Такой интерфейс реализован в терминале macOS и командной строке Windows.
Для работы с GUI в Python есть четыре библиотеки: