Python 中的事件

Manav Narula 2023年1月30日
  1. 在 Python 中使用 tkinter 模块创建 GUI 应用程序
  2. 使用 Python 处理事件的主要类
  3. 使用 pynput.keyboard 模块检测 Python 中的按键
Python 中的事件

事件处理创建了一个响应式应用程序,可以检测并生成响应操作。

事件是对象检测到的响应或动作。在 Python 中,事件处理是使用类完成的。

在 Python 中使用 tkinter 模块创建 GUI 应用程序

tkinter 模块用于创建 GUI 应用程序,这些应用程序等待用户的响应并在图形界面中执行功能。

使用 Python 处理事件的主要类

  • publisher 类生成一个事件。
  • subscriber 类接收这些事件。
class sample_event(object):
    def __init__(self):
        self.__eventhandler_sample = []

    def __iadd__(self, Eventhandler):
        self.__eventhandler_sample.append(Eventhandler)
        return self

    def __isub__(self, Eventhandler):
        self.__eventhandler_sample.remove(Eventhandler)
        return self

    def __call__(self, *args, **keywargs):
        for eventhandler_sample in self.__eventhandler_sample:
            eventhandler_sample(*args, **keywargs)


class MessToDisplay(object):
    def __init__(self, val):
        self.val = val

    def PrintM(self):
        print("Message for an event with value ", self.val)


class sample_class(object):
    def __init__(self):
        self.ob = sample_event()

    def EHnew(self):
        self.ob()

    def anotherevent(self, objMeth):
        self.ob += objMeth


def seq():
    newsample = sample_class()
    displayamess = MessToDisplay(5)
    newsample.anotherevent(displayamess.PrintM)
    newsample.EHnew()


seq()

输出:

Message for an event with value 5

seq() 函数定义了不同事件的流程,以打印出消息、附加消息和删除消息。

Python 中有不同类型的事件。例如检测按键光标移动鼠标点击,甚至基于计时器的事件。

使用 pynput.keyboard 模块检测 Python 中的按键

from pynput.keyboard import Key, Listener


def press_key(k):
    print(k)


def release_key(k):
    if k == Key.space:
        return False


with Listener(on_press=press_key, on_release=release_key) as listener:
    listener.join()

输出:

'b'
Key.space

Listener() 函数通过执行 press_keyrelease_key 函数来检测这些事件

需要按下空格键来停止这些事件的流动,因为它返回 false 并将停止 Listener() 函数。

作者: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn