在Python鼠标模块中使用回调(检索事件类型)

时间:2018-11-04 14:56:31

标签: python callback mouse

我正在使用Python模块“ Mouse”捕获鼠标输入(更具体地说,是鼠标坐标,输入按钮和输入类型)。 来源:https://github.com/boppreh/mouse

查看on_button()和on_click()的源代码,我不确定如何将event_type传递回“鼠标按下”和“鼠标按下”的代码:

def left_mouse():
    print('LEFT ', mouse.get_position())
    # I want to get the [mouse button, example: left] and [type, example: up] from the logging

mouse.on_click(left_mouse)

MOUSE MODULE的源代码:on_button和on_click;我猜我没有适当地调用回调,但无法找出正确的方法:

def on_button(callback, args=(), buttons=(LEFT, MIDDLE, RIGHT, X, X2), types=(UP, DOWN, DOUBLE)):
    """ Invokes `callback` with `args` when the specified event happens. """
    if not isinstance(buttons, (tuple, list)):
        buttons = (buttons,)
    if not isinstance(types, (tuple, list)):
        types = (types,)

    def handler(event):
        if isinstance(event, ButtonEvent):
            if event.event_type in types and event.button in buttons:
                callback(*args)
    _listener.add_handler(handler)
    return handler

def on_click(callback, args=()):
    """ Invokes `callback` with `args` when the left button is clicked. """
    return on_button(callback, args, [LEFT], [UP])

一如既往的感谢。

1 个答案:

答案 0 :(得分:0)

因此,根据以上评论,您正在努力检索事件是“ up”还是“ down”。
从本质上讲,不需要使用此信息,因为您使用的此功能只有一项特定的工作。 event_up (在我的评论中,我说它是向下移动的,但始终向上移动),并且总是“鼠标左键”。意思是说,无需向您传递此信息-由于您正在使用的库功能,on_click()是一条没有任何可变结果的单向道路。

您可以通过执行代码并按住鼠标左键来尝试此操作,直到您松开该按钮,一切都不会发生。那就是左+上触发的时间-唯一可能来自on_click()的结果。

您遇到的问题可能是您试图附加函数left_mouse()来处理所有鼠标事件?

通常,您将为每个事件附加一个唯一的功能-就像您在代码中使用left_mouse()一样。但是,如果由于某种原因需要合并它们,这就是方法:

def mouse(event):
    print('Position:', mouse.get_position())
    print('Event:', event)

mouse.on_click(left_mouse, args=('mouse_left', 'mouse_up'))
mouse.on_righ_click(left_mouse, args=('mouse_right', 'mouse_up'))

但是同样,这是如果您想将一个函数与预定义的库函数结合使用以进行不同的鼠标操作。

您可能感兴趣的是mouse.ButtonEvent类。此事件具有触发器和附加的信息。但是要获取此事件/对象,您需要进行连接,并让库知道您要负责每个事件。这意味着您不能为 left-mouse-release 等使用预构建的函数,需要构建自己的事件处理程序。为此,您可以先调用mouse.hook,然后再调用每个鼠标事件要调用的函数。

例如:

import mouse
import time

events = []
mouse.hook(events.append)
while 1:
    mouse._listener.queue.join()
    for event in events:
        print(event)
    del events[:]
    time.sleep(0.25)

您注册函数events.append (常规的列表附加函数),每次鼠标移动时都会调用它。 (您也可以将其替换为您自己的函数,并直接在函数中处理事件,就像您尝试执行的操作一样)

从那里,您可以访问每个“框架”或鼠标事件并相应地执行操作。

所有这些内容都可以在库自己的test cases中找到,以了解它们如何测试每个功能。
并不是您要找的第一件事,而且在“如何入门”方面还没有记载。