ЛЕКЦИЯ 8
.pdfЛЕКЦИЯ 8. Организация взаимодействия с пользователем. Интерфейсы. Web-разработка.
1. GUI-приложения. 2.Tkinter.
2.1.Пример.
3.wxPython.
3.1.Надстройки wxPython. 4.PyQt.
5.PyGTK.
6.Jython.
7.IronPython.
8.Полнофункциональные интернет-приложения (Rich Internet Applications, RIA). 9.Сбор данных в Web с помощью mechanize и Beautiful Soup.
Рекомендуемая литература:
● Марк Лутц - Программирование на Python, 4-е издание, I том, 2011
GUI (Graphical User Interface)
1.GUI-приложения.
Общая схема работы GUI (Graphical User Interface) :
●создаётся бесконечный цикл опроса (ожидания) событий (главный цикл), порождаемых действиями пользователя (ввод с клавиатуры, перемещение указателя или нажатие кнопки мыши и т.д.);
●для каждого потенциально возможного (обрабатываемого) события назначается функция обратного вызова (callback функция), которая будет вызываться при наступлении этого события (обработчик события);
●при возникновении событий, для которых не были назначены обработчики, они будут игнорироваться;
●на каждом "витке" главного цикла приложения анализируются наступившие (со времени предыдущего "витка") события, и для каждого такого события вызывается его обработчик, если ожидающих событий несколько, то они обрабатываются в порядке очереди;
●всякий GUI-инструмент имеет некоторый набор графических компонентов (виджетов - widget) и средства для компоновки таких виджетов в окне приложения, а каждый из компонентов имеет свой специфический набор событий, которые он может генерировать;
Такой подход называется событийно управляемым программированием (event driven programming). Все GUI приложения, независимо от используемой графической технологии, будут использовать этот общий шаблон.
Примечание. Внешний вид одного и того же GUI-приложения может отличаться при запуске в разных средах (операционных системах, менеджерах рабочего стола, оконных менеджерах). Это обусловлено тем, что фактическую прорисовку виджетов обеспечивают не графические библиотеки, а оконный менеджер графической системы.
1.GUI-приложения.
Ещё одной привлекательной особенностью Python является простота, скорость и гибкость в создании приложений с GUI. Это преимущество связано не только с большим количеством поддерживаемых графических библиотек: Tkinter, PyQt, PyGTK, wxPython, Pygames и др.
Основная причина заключается в интерпретирующей природе платформы Python, так как из-за доступности Python-кода внешний вид графического приложения всегда можно изменить или дополнить.
Python предлагает:
●независимость от платформы: графическое приложение, разработанное на Python в одной ОС (например, Linux) будет с большой степенью вероятности адекватно работать в любой другой среде (Windows, MacOS, Solaris, FreeBSD, …) или потребует для этого незначительных доработок;
●GUI-приложения в основном являются диалоговыми, т.е. предназначенными для взаимодействия с пользователем, при этом скорость работы приложения определяется действиями пользователя, и здесь исчезает один из основных формальных недостатков
Python — его замедленность по сравнению с C или C++;
●из-за простоты интеграции Python с C/C++, визуальные компоненты проекта (GUI) могут быть написаны на Python с учётом скорости разработки, а внутренние процедуры для обработки данных — на C/C++ .
2.Tkinter.
Библиотека для разработки GUI, ставшая де-факто стандартом для разработки переносимых GUI на языке Python. Она может легко расширяться программным кодом на языке Python, а также имеет множество дополнительных пакетов, таких как
●Pmw (сторонняя библиотека виджетов);
●Tix (еще одна библиотек виджетов, ныне ставшая стандартной частью Python);
●PIL (расширение для обработки изображений);
●ttk (библиотека виджетов Tk, поддерживающих темы оформления).
Библиотека Tk, на которой основана библиотека tkinter, является стандартом в мире открытого программного обеспечения в целом и используется также языками сценариев Perl, Ruby, PHP, Common Lisp и Tcl, благодаря чему количество пользователей этой библиотеки может исчисляться миллионами.
tkinter – зрелая, надежная, широко используемая и хорошо документированная библиотека. Она включает около 25 основных типов виджетов, а также различные диалоги и другие инструменты.
Несмотря на простоту библиотеки tkinter, ее текстовые и графические виджеты обеспечивают достаточно широкие возможности для реализации веб-страниц, трехмерных изображений и анимации.
2.1.Пример.
#!/usr/bin/python3
# -*- coding: utf-8 -*- from sys import argv import random import math
from tkinter import *
val_range = 0 # диапазон числа secret = 0 # угадываемое число guesses = 0 # число попыток limits = 0 # макс. число попыток
def new_game():
global secret, guesses, limits msg[ 'text' ] = ' ' * 100 + \
'\nНовая игра, диапазон: [ 0...{} )\n'.format( val_range ) secret = random.randrange( 0,val_range )
guesses = 0
limits = int( math.ceil( math.log( val_range, 2 ) ) )
def input_guess( event ): global guesses
if guesses < 0 : # признак завершённой игры msg[ 'text' ] += 'Начните новую игру...\n' ent.delete( 0, END )
return
2.1.Пример.
try : |
|
|
|
value = int( ent.get() ) |
|
|
|
except ValueError: |
|
root = Tk() |
|
msg[ 'text' ] += 'Ошибка: значение должно быть |
root.title( 'Угадай число!' ) |
# окно приложения |
|
целочисленным!\n' |
|
root.geometry( '500x240' ) |
|
ent.delete( 0, END ) |
Label( root, text='Вводите следующее число...' ).pack( side=TOP ) |
||
return; |
|
ent = Entry( root, width=10 ) |
# поле ввода |
ent.delete( 0, END ) |
|
ent.pack( side=TOP ) |
|
guesses += 1 |
|
ent.focus() # избавить от необходимости выполнять щелчок мышью |
|
if value < secret : |
|
для фокуса |
|
msg[ 'text' ] += '{} - это меньше ...\n'.format( value ) |
ent.bind( '<Return>', input_guess ) |
||
elif value > secret : |
|
Button( root, text=' Новая игра ', |
|
msg[ 'text' ] += '{} - это больше ...\n'.format( value ) |
command=new_game ).pack( side=BOTTOM ) |
||
else : |
|
msg = Message( root, bg='white', fg='black', width=400, borderwidth=0 ) |
|
msg[ 'text' ] += 'Игрок выиграл!\n' |
msg.pack( side=TOP ) |
# окно результата |
|
guesses = -1 |
# признак завершённой игры |
|
|
return |
|
val_range = ( len( argv ) > 1 and int( argv[ 1 ] ) ) or 100 # параметр - |
|
if guesses >= limits : |
|
диапазон |
|
msg[ 'text' ] += 'Компьютер выиграл! Загадно было |
new_game() |
|
|
{}\n'.format( secret ) |
# признак завершённой игры |
root.mainloop() |
|
guesses = -1 |
|
|
|
return |
|
|
|
3.wxPython.
Интерфейс Python к библиотеке wxWidgets с открытыми исходными текстами, которая представляет собой переносимую структуру классов GUI, первоначально созданную для использования из программ на языке C++. Система wxPython является модулем расширения, служащим оболочкой для классов wxWidgets. Эта библиотека превосходно подходит для создания сложных интерфейсов и сегодня является, вероятно, вторым по популярности инструментом создания графических интерфейсов в Python после tkinter. Графические интерфейсы, созданные с применением wxPython, переносимы на Windows и Unix-подобные платформы и Mac OS X.
Поскольку интерфейс wxPython опирается на библиотеку классов C++, многие полагают, что он более сложен в использовании, чем библиотека tkinter: он предоставляет доступ к сотням классов, для чего требуется прибегать к ООП. Применение wxPython часто требует от программистов писать больше программного кода, отчасти потому, что этот интерфейс обладает более широкими функциональными возможностями, а отчасти потому, что именно такой образ мышления он унаследовал от библиотеки C++, лежащей в его основе.
Кроме того, часть документации wxPython ориентирована на программистов, использующих язык C++. В обмен на повышенную сложность библиотека wxPython обеспечивает набор мощных инструментов. В состав wxPython входит более богатый набор виджетов, чем в библиотеку tkinter, включая деревья и компоненты просмотра HTML – чтобы получить такие же компоненты при использовании tkinter, может потребоваться задействовать такие расширения, как Pmw, Tix или ttk.
3.1.Надстройки wxPython.
●PythonCard. Построитель и библиотека GUI с открытыми исходными текстами, реализованные поверх wxPython.
Считается одним из самых близких Python-эквивалентов того вида построителей GUI, которые хорошо знакомы разработчикам на Visual Basic.
PythonCard позиционируется разработчиками, как конструктор GUI для создания на языке Python кроссплатформенных приложений, способных выполняться в Windows, Mac OS X и Linux.
●Dabo. Построитель графических интерфейсов с открытыми исходными текстами, также реализованный на основе wxPython, но не только.
Dabo – это переносимый, трехуровневый, кроссплатформенный фреймворк для разработки настольных приложений на языке Python, созданный по образу и подобию Visual FoxPro.
Трехуровневая организация обеспечивает возможность доступа к базе данных, реализации бизнес-логики и пользовательского интерфейса.
Открытая архитектура способна поддерживать различные типы баз данных и механизмов создания графических интерфейсов (wxPython, tkinter и даже HTML через HTTP).
4.PyQt.
Интерфейс Python к библиотеке Qt (ныне принадлежит Nokia, ранее принадлежала компании Trolltech), занимающей, пожалуй, третье место среди наиболее часто используемых инструментов GUI для Python.
PyQt – это полноценная библиотека создания графических интерфейсов, которая на сегодняшний день переносима в Windows, Mac OS X, Unix и Linux. Она зародилась и выросла в Linux, но со временем была перенесена и на другие системы.
Подобно wxPython, библиотека PyQt в целом более сложна в использовании, чем tkinter, и при этом обладает более богатыми возможностями – она содержит сотни классов и тысячи функций и методов.
Самым важным, пожалуй, недостатком Qt в прошлом считалась неполная открытость библиотеки для коммерческого использования. Сегодня библиотека Qt распространяется не только под коммерческой лицензией, но и под открытыми лицензиями GPL и LGPL.