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