Выбрать главу

Tom Doe 65000.0 Smith Doe

Мы сможем использовать наш новый сценарий для запроса объектов из базы данных в интерактивном режиме:

...\PP4E\Preview> peopleinteract_query.py

Key? => sue name => Sue Jones

age => 45 job => hardware pay => 50000.0

Key? => nobody No such key “nobody”!

Key? =>

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

Пример 1.22. PP4E\Preview\peopleinteract_update.py

# интерактивные изменения

import shelve

from person import Person

fieldnames = (‘name’, ‘age’, ‘job’, ‘pay’)

db = shelve.open(‘class-shelve’) while True:

key = input(‘\nKey? => ‘) if not key: break if key in db:

record = db[key]    # изменить существующую

else:    # или создать новую запись

record = Person(name=’?’, age=’?’) # для evaclass="underline" строки в кавычках for field in fieldnames:

currval = getattr(record, field)

newtext = input(‘\t[%s]=%s\n\t\tnew?=>’ % (field, currval)) if newtext:

setattr(record, field, eval(newtext)) db[key] = record db.close()

Обратите внимание, что для преобразования введенных значений в этом сценарии используется функция eval (это позволяет вводить любые объекты Python, но это означает, что строки при вводе должны заключаться в кавычки). Функция setattr присваивает значение атрибуту, имя которого задается строкой. Этот сценарий позволит добавлять или изменять любое количество записей - чтобы сохранить прежнее значение поля в записи, достаточно просто нажать клавишу Enter в ответ на просьбу ввести новое значение:

Key? => tom

[name]=Tom Doe new?=>

[age]=50

new?=>56

[job]=None

new?=>'mgr'

[pay]=65000.0

new?=>90000

Key? => nobody [name]=?

new?=>'John Doh'

[age]=?

new?=>55

[job]=None

new?=>

[pay]=0

new?=>None

Key? =>

Этот сценарий все еще очень прост (в нем, например, не предусмотрена обработка ошибок), но пользоваться им гораздо удобнее, чем вручную открывать и вносить изменения в хранилище в интерактивной оболочке Python, особенно для тех, кто не занимается программированием. Запустим сценарий peopleinteract_query.py, чтобы проверить изменения, которые мы внесли (если кому-то такой подход покажется утомительным, он сможет объединить оба сценария в один, ценой дополнительного программного кода и повышения сложности для пользователя):

Key? => tom name => Tom Doe age => 56 job => mgr pay => 90000

Key? => nobody name => John Doh age => 55 job => None pay => None

Key? =>

Шаг 5: добавляем графический интерфейс

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

Основы графических интерфейсов

Как будет показано далее в этой книге, программистам, использующим язык Python, доступно множество разнообразных инструментов создания графических интерфейсов: tkinter, wxPython, PyQt, PythonCard, Dabo и многие другие. Из них в составе Python поставляется только tkinter, который де-факто считается стандартным инструментом.

tkinter - это легковесный инструмент, который прекрасно интегрируется с языками сценариев, такими как Python. Его легко использовать для реализации простых графических интерфейсов, а дополнительные расширения к нему и применение приемов объектно-ориентированного программирования позволяют без особых затрат реализовать более сложные интерфейсы. Кроме того, реализация графического интерфейса на базе tkinter способна без каких-либо модификаций работать в Windows, Linux/Unix и Macintosh - достаточно просто перенести файлы с исходными текстами на компьютер, где предполагается использовать программу с графическим интерфейсом. В tkinter отсутствуют разнообразные «бантики и рюшечки», имеющиеся в более развитых инструментах, таких как wxPython или PyQt, но это же является основной причиной его относительной простоты, что делает его идеальным инструментом для тех, кто только начинает создавать программы с графическим интерфейсом.

Инструмент tkinter разработан для использования в сценариях, поэтому программирование графических интерфейсов с его применением организовано с достаточной очевидностью. Далее в этой книге мы поближе познакомимся со всеми его понятиями и возможностями. А в качестве первого примера рассмотрим программу, использующую tkinter, которая содержит всего несколько строк программного кода, как видно из примера 1.23.