Вернемся к теме программирования графических интерфейсов. Во многих случаях вполне можно ограничиться функциями и lambda-выражениями, однако связанные методы класса тоже прекрасно справляются с ролью обработчиков событий в графических интерфейсах — они запоминают не только экземпляр, которому было послано событие, но и связанный с ним метод, который должен быть вызван. Рассмотрим пример 7.14, где приводится переработанная версия примеров 7.12 и 7.13, регистрирующая связанный метод класса вместо функции или результата lambda-выражения.
Пример 7.14. PP4E\Gui\Intro\gui3c.py
import sys
from tkinter import *
class HelloClass:
def __init__(self):
widget = Button(None, text=’Hello event world’, command=self.quit) widget.pack()
def quit(self):
print(‘Hello class method world’) # self.quit — связанный метод sys.exit() # хранит пару self+quit
HelloClass() mainloop()
При нажатии кнопки библиотека tkinter вызовет метод quit этого класса как обычно, без аргументов. Но в действительности он получит один аргумент — оригинальный объект self — хотя tkinter не передает его явно. Поскольку связанный метод self.quit хранит обе ссылки, self и quit, он совместим с вызовом простой функции — интерпретатор Python автоматически передаст аргумент self функции метода. Напротив, регистрация несвязанного метода экземпляра в виде HelloClass.quit работать не станет, потому что в этом случае не будет объекта self, который можно передать потом при возникновении события.
Позднее мы увидим, что приемы использования классов в качестве обработчиков событий также предоставляют естественное место для сохранения данных, используемых при возникновении событий, — достаточно просто присвоить их атрибутам экземпляра self:
class someGuiClass:
def __init__(self):
self.X = 42
self.Y = ‘spam’
Button(text=’Hi’, command=self.handler) def handler(self):
…использование self.X, self.Y…
Поскольку событие будет отправлено методу этого класса со ссылкой на оригинальный объект экземпляра, аргумент self позволит обращаться к атрибутам, содержащим исходные данные. В действительности атрибуты экземпляра сохраняют информацию для использования в процессе обработки события. Этот прием обеспечивает большую гибкость, чем глобальные переменные или дополнительные аргументы, добавляемые с помощью lambda-выражений, особенно заметную в больших графических интерфейсах.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011