zltzlt 发表于 2020-1-5 08:25:59

实用干货:Python 键盘鼠标控制与监听 —— Pynput 中文文档

本帖最后由 zltzlt 于 2020-1-5 10:29 编辑



这里是实用干货:Python 键盘鼠标控制与监听 —— Pynput 中文文档。
如果喜欢,不要忘记点点评分哦!{:10_281:}
Pynput 基本使用

请参考 Python 小技巧 047:监听、控制鼠标与键盘。
Pynput 其他用法

处理监听器错误

如果监听器在监听时产生了异常会自动退出监听。如果想接收到监听器产生的异常,可以这样:

# 鼠标
from pynput import mouse


def on_click(x, y, button, pressed):
    # 按下左键则抛出异常
    if button == mouse.Button.left:
      raise Exception(button)


with mouse.Listener(
      on_click=on_click) as listener:
    try:
      listener.join()
    except Exception as e:
      print('{} 被按下'.format(e.args))

from pynput import keyboard


def on_press(key):
    # 当按下键盘的 <Esc> 则抛出异常
    if key == keyboard.Key.esc:
      raise Exception(key)


with keyboard.Listener(
      on_press=on_press) as listener:
    try:
      listener.join()
    except Exception as e:
      print('{0} 被按下'.format(e.args))

鼠标事件监听

注:如果出现错误,请将 pynput._utils.__init__.py 中第 225 行的 vars(self) 修改为 vars(self).items()

(见图 1 和图 2)

from pynput import mouse

# 事件监听
with mouse.Events() as events:
    # 获取事件(等待最多一秒钟)
    event = events.get(1)
    if event is None:
      print('你没有在一秒钟内触发鼠标事件')
    else:
      print(f"产生的事件是:{str(event)}")

键盘事件监听

注:如果出现错误,请将 pynput._utils.__init__.py 中第 225 行的 vars(self) 修改为 vars(self).items()

(见图 1 和图 2)

from pynput import keyboard

with keyboard.Events() as events:
    # 获取时间(等待最多一秒钟)
    event = events.get(1)
    if event is None:
      print('你没有在一秒之内按下键盘上的任意一个键')
    else:
      print(f"接收到的事件是:{event}")

遍历鼠标事件

注:如果出现错误,请将 pynput._utils.__init__.py 中第 225 行的 vars(self) 修改为 vars(self).items()

(见图 1 和图 2)

from pynput import mouse

with mouse.Events() as events:
    for event in events:
      # 如果按下鼠标右键则退出
      try:
            if event.button == mouse.Button.right:
                break
      except Exception:
            pass
      print(f"收到的事件是:{event}")

遍历键盘事件

注:如果出现错误,请将 pynput._utils.__init__.py 中第 225 行的 vars(self) 修改为 vars(self).items()。

(见图 1 和图 2)

from pynput import keyboard

with keyboard.Events() as events:
    for event in events:
      # 如果按下 <Esc> 键则退出
      if event.key == keyboard.Key.esc:
            break
      else:
            print(f"收到的事件是:{event}")

设置热键

我们可以为程序设置热键。

# 不推荐,只能设置单个热键
from pynput import keyboard


def on_activate():
    print('按下了 <ctrl>+<alt>+h')


hotkey = keyboard.HotKey(
    keyboard.HotKey.parse('<ctrl>+<alt>+h'),
    on_activate)
with keyboard.Listener(
      on_press=hotkey.press,
      on_release=hotkey.release) as l:
    l.join()

# 推荐
from pynput import keyboard


def on_activate_h():
    print('按下了 <ctrl>+<alt>+h')


def on_activate_i():
    print('按下了 <ctrl>+<alt>+i')


with keyboard.GlobalHotKeys({'<ctrl>+<alt>+h': on_activate_h, '<ctrl>+<alt>+i': on_activate_i}) as h:
    h.join()

图 1:



图 2:


pynput.mouse 提供了对鼠标的操作。

pynput.mouse.Controller

鼠标控制器。


[*]click(button, count=1)

鼠标按钮单击。button 是要单击的键,可以是 pynput.mouse.Button.left(左键)、pynput.mouse.Button.right(右键)和 pynput.mouse.Button.middle(中键)。


[*]move(dx, dy)

将鼠标指针从当前位置移动。dx 是水平移动量,dy 是垂直移动量(以像素为单位),可以为负数。

注意:如果 dx 或 dy 无效或超出范围,则抛出 ValueError。


[*]position

元组 (x, y),表示当前鼠标指针的位置。可以对它进行设置,对其设置将移动鼠标指针。


[*]press(button)

在当前位置按下鼠标按钮。button 为要按下的按钮,可以是 pynput.mouse.Button.left(左键)、pynput.mouse.Button.right(右键)和 pynput.mouse.Button.middle(中键)。


[*]release(button)

在当前位置释放鼠标按钮。button 为要释放的按钮,可以是 pynput.mouse.Button.left(左键)、pynput.mouse.Button.right(右键)和 pynput.mouse.Button.middle(中键)。


[*]scroll(dx, dy)

在当前位置滚动鼠标滚轮。dx 为垂直滚动量,dy 为垂直滚动量。


pynput.mouse.Listener

鼠标事件监听器。此类继承自 threading.Thread,该类的实例可以被用作上下文管理器(with)。



[*]__init__(on_move=None, on_click=None, on_scroll=None, suppress=False, **kwargs)

监听器初始化方法。

on_move 是发生鼠标移动事件时调用的方法,传进 2 个参数 x 和 y,分别代表指针移动后的 x 坐标和 y 坐标。

on_click 是发生鼠标单击事件时调用的方法,传进 4 个参数 x、y、button 和 pressed。x 和 y 分别代表指针移动后的 x 坐标、y 坐标,button 代表按下的鼠标按钮(是 是 pynput.mouse.Button.left(左键)、pynput.mouse.Button.right(右键)和 pynput.mouse.Button.middle(中键) 之一),pressed 代表发生的是鼠标按钮按下事件还是释放事件。

on_scroll 是发生鼠标滚轮滚动事件时调用的方法,传进 4 个参数 x、y、dx、dy。x 和 y 分别代表指针的 x 坐标、y 坐标,dx 和 dy 代表滚动的向量。

suppress 代表是否禁止将事件的发生传递到系统中。将此参数设置为 True 将阻止将事件传递到系统。


[*]running

布尔值,为 True 则代表监听器正在运行,为 False 代表监听器已停止运行。


[*]start()

启动监听器。此方法在同一线程中只能调用一次,多次调用将引发 RuntimeError。


[*]stop()

停止监听。一旦停止了监听器就不能再使用。


[*]wait()

等待监听器准备就绪。

pynput.keyboard 提供了对键盘的操作。

pynput.keyboard.Controller

键盘控制器。


[*]alt_gr_pressed

布尔值,代表控制器是否按下 Alt gr 键。


[*]alt_pressed

布尔值,代表控制器是否按下 Alt 键。


[*]ctrl_pressed

布尔值,代表控制器是否按下 Ctrl 键。


[*]modifier

控制器当前按下的 Ctrl、Alt、Windows 或 Shift 键。通过上下文管理器使用该属性:

from pynput.keyboard import Controller, Key

c = Controller()

c.press(Key.shift)
c.press(Key.ctrl)
c.press(Key.alt)

with c.modifiers as modifiers:
    print(modifiers)

运行结果:

{<Key.alt: <18>>, <Key.shift: <160>>, <Key.ctrl: <17>>}


[*]press(key)

按下一个键。key 可以是长度为 1 的字符串(例如 'a' 、'b'),也可以是 Key 或 KeyCode 的属性之一。

注意:如果 key 无效,将抛出 InvalidKeyException;如果 key 是字符串但长度不为 1,将抛出 ValueError。


[*]pressed(*args)

按下 *args 所指定的键执行程序段,需要配合上下文管理器使用。例如:

from pynput.keyboard import Controller, Key

c = Controller()

with c.pressed(Key.ctrl, Key.alt):
    c.press("s")

该程序将会同时按下 Ctrl + Alt + S 键。


[*]release(key)

释放一个键。key 可以是长度为 1 的字符串(例如 'a' 、'b'),也可以是 Key 或 KeyCode 的属性之一。

注意:如果 key 无效,将抛出 InvalidKeyException;如果 key 是字符串但长度不为 1,将抛出 ValueError。


[*]shift_pressed

布尔值,代表控制器是否按下 shift 键。


[*]touch(key, is_press)

如果 is_pressed 为 True 则调用 press(key),否则调用 release(key)。例如:

from pynput.keyboard import Controller

c = Controller()

c.touch("a", True)
c.touch("a", False)

这段程序会按下并释放字母 a 键。

注意:如果 key 无效,将抛出 InvalidKeyException。


[*]type(string)

输入字符串 string。例如 type('hi !') 会输入 'hi !'(不包括双引号)。

注意:如果 string 中有无法键入的字符,将抛出 InvalidCharacterException。


pynput.keyboard.Listener

键盘监听器。


[*]__init__(on_press=None, on_release=None, suppress=False, **kwargs)

监听器初始化方法。

on_press 是发生键盘按键按下时调用的方法,传进 1 个参数 key,代表用户按下的按键。key 是 KeyCode 实例或 Key 的属性之一,如果用户按下的键未知,则 key 为 None。

on_release 是发生键盘按键释放时调用的方法,传进 1 个参数 key,代表用户释放的按键。key 是 KeyCode 实例或 Key 的属性之一,如果用户按下的键未知,则 key 为 None。

suppress 代表是否禁止将事件的发生传递到系统中。将此参数设置为 True 将阻止将事件传递到系统。


[*]running

布尔值,为 True 则代表监听器正在运行,为 False 代表监听器已停止运行。


[*]start()

启动监听器。此方法在同一线程中只能调用一次,多次调用将引发 RuntimeError。


[*]stop()

停止监听。一旦停止了监听器就不能再使用。


[*]wait()

等待监听器准备就绪。


pynput.keyboard.Key

存放着各种按键的类。


[*]alt

Alt 键。


[*]alt_gr

Alt gr 键。


[*]alt_l

左 Alt 键。


[*]alt_r

右 Alt 键。


[*]backspace

退格键。


[*]caps_lock

Caps Lock 键。


[*]cmd

通用的命令按钮。在 Windows 上,这对应 Windows 键;在 Mac 上,这对应 command 键。


[*]cmd_l

左命令按钮。


[*]cmd_r

右命令按钮。


[*]ctrl

Ctrl 键。


[*]ctrl_l

左 Ctrl 键。


[*]ctrl_r

右 Ctrl 键。


[*]delete

Delete 键。


[*]down

向下 ↓ 箭头键。


[*]end

End 键。


[*]enter

回车(Enter 或 Return)键。


[*]esc

Esc 键。


[*]f1

F1 键。


[*]f2

F2 键。


[*]f3

F3 键。


[*]f4

F4 键。


[*]f5

F5 键。


[*]f6

F6 键。


[*]f7

F7 键。


[*]f8

F8 键。


[*]f9

F9 键。


[*]f10

F10 键。


[*]f11

F11 键。


[*]f12

F12 键。


[*]f13

F13 键。


[*]f14

F14 键。


[*]f15

F15 键。


[*]f16

F16 键。


[*]f17

F17 键。


[*]f18

F18 键。


[*]f19

F19 键。


[*]f20

F20 键。


[*]home

Home 键。


[*]insert

Insert 键。对于某些操作系统,这可能是没有定义的。


[*]left

向左 ← 箭头键。


[*]media_next

下一首歌曲按钮。


[*]media_play_pause

播放 \ 暂停切换按钮。


[*]media_previous

上一首歌曲按钮。


[*]media_valume_down

降低音量按钮。


[*]media_valume_mute

静音按钮。


[*]media_valume_up

提高音量按钮。


[*]menu

菜单键。对于某些操作系统,这可能是没有定义的。


[*]num_lock

Num Lock 键。对于某些操作系统,这可能是没有定义的。


[*]page_down

Page Down 键。


[*]page_up

Page Up 键。


[*]pause

Pause / Break 键。对于某些操作系统,这可能是没有定义的。


[*]print_screen

Print Screen 键。对于某些操作系统,这可能是没有定义的。


[*]right

向右 → 箭头键。


[*]scroll_lock

Scroll Lock 键。对于某些操作系统,这可能是没有定义的。


[*]shift

Shift 键。


[*]shift_l

左 Shift 键。


[*]shift_r

右 Shift 键。


[*]space

空格键。


[*]tab

Tab 键。


[*]up

向上 ↑ 箭头键。


pynput.keyboard.KeyCode

键盘编码描述。


[*]classmethod from_char(char, **kwargs)

从字符创建 KeyCode 对象。


[*]classmethod from_dead(char, **kwargs)

创建一个 “死” 按键对象。char 应该是单个 Unicode 字符,例如 "~"。


[*]classmethod from_vk(vk, **kwargs)

从虚拟按键编码创建 KeyCode 对象。


[*]join(key)

将 “死” 键应用于另一个键并返回结果。

注意:如果键不能被连接在一起,则抛出 ValueError。

lixiangyv 发表于 2020-1-5 09:49:06

你确定有F13~F20这些键吗?

zltzlt 发表于 2020-1-5 10:07:18

lixiangyv 发表于 2020-1-5 09:49
你确定有F13~F20这些键吗?

这是 Key 类的属性,在某些系统中可能会有。

zltzlt 发表于 2020-1-5 10:29:37

@小甲鱼 更新完毕,申精{:10_281:}

@一个账号 @henry2018 @_2_ 来看看吧{:10_256:}

一个账号 发表于 2020-1-5 10:56:29

zltzlt 发表于 2020-1-5 10:29
@小甲鱼 更新完毕,申精

@一个账号 @henry2018 @_2_ 来看看吧

有没有方法禁用除了字母、数字、特殊字符、和空格之外的字符

zltzlt 发表于 2020-1-5 11:00:46

一个账号 发表于 2020-1-5 10:56
有没有方法禁用除了字母、数字、特殊字符、和空格之外的字符

没有

_2_ 发表于 2020-1-5 16:16:13

引用:join(key)

将 “死” 键应用于另一个键并返回结果。
注意一下标红的部分,你确定是这个意思吗?

zltzlt 发表于 2020-1-5 16:19:18

_2_ 发表于 2020-1-5 16:16
引用:join(key)

将 “死” 键应用于另一个键并返回结果。


是,原英文文档也是这样说。

_2_ 发表于 2020-1-5 16:20:30

zltzlt 发表于 2020-1-5 16:19
是,原英文文档也是这样说。

机翻的不一定准确,建议你逐词翻译一下

zltzlt 发表于 2020-1-5 16:21:56

_2_ 发表于 2020-1-5 16:20
机翻的不一定准确,建议你逐词翻译一下

没有机翻{:10_277:}原文如图:

https://s2.ax1x.com/2020/01/05/lDer1H.png

_2_ 发表于 2020-1-5 16:24:07

zltzlt 发表于 2020-1-5 16:19
是,原英文文档也是这样说。

许多翻译连 AI 都不一定翻译的准确,还是需要人为翻译,机器并不会感受语境

zltzlt 发表于 2020-1-5 16:25:02

_2_ 发表于 2020-1-5 16:24
许多翻译连 AI 都不一定翻译的准确,还是需要人为翻译,机器并不会感受语境

KeyCode 不太常用,所以我没有说得那么详细{:10_277:}我也尽力了

_2_ 发表于 2020-1-5 16:29:21

zltzlt 发表于 2020-1-5 16:21
没有机翻原文如图:

@不二如是 来帮他翻译一下{:10_256:}

earnest999 发表于 2020-1-7 08:15:35

这个值得好好学习

太空军校生 发表于 2020-1-8 09:47:25

学习学习,感谢楼主。

一个账号 发表于 2020-1-10 17:02:29

zltzlt 发表于 2020-1-5 10:29
@小甲鱼 更新完毕,申精

@一个账号 @henry2018 @_2_ 来看看吧

怎么被解除精华了?

wudanyangggo 发表于 2021-5-20 18:01:23

想问一下如果输入的是中文字符怎么办,我输出的都是一些类似<101>这样的字符

wangjialeyuc 发表于 2022-6-23 13:29:07

wudanyangggo 发表于 2021-5-20 18:01
想问一下如果输入的是中文字符怎么办,我输出的都是一些类似这样的字符

请问解决了吗?如何监听输入中文呢
页: [1]
查看完整版本: 实用干货:Python 键盘鼠标控制与监听 —— Pynput 中文文档