Связанные методы как обработчики событий

svyazannye metody kak obrabotchiki sobytij Графические интерфейсы пользователя

Вернемся к теме программирования графических интерфейсов. Во многих случаях вполне можно ограничиться функциями и 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

Оцените статью
Секреты программирования
Добавить комментарий