实用干货: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。
你确定有F13~F20这些键吗? lixiangyv 发表于 2020-1-5 09:49
你确定有F13~F20这些键吗?
这是 Key 类的属性,在某些系统中可能会有。 @小甲鱼 更新完毕,申精{:10_281:}
@一个账号 @henry2018 @_2_ 来看看吧{:10_256:} zltzlt 发表于 2020-1-5 10:29
@小甲鱼 更新完毕,申精
@一个账号 @henry2018 @_2_ 来看看吧
有没有方法禁用除了字母、数字、特殊字符、和空格之外的字符 一个账号 发表于 2020-1-5 10:56
有没有方法禁用除了字母、数字、特殊字符、和空格之外的字符
没有 引用:join(key)
将 “死” 键应用于另一个键并返回结果。
注意一下标红的部分,你确定是这个意思吗?
_2_ 发表于 2020-1-5 16:16
引用:join(key)
将 “死” 键应用于另一个键并返回结果。
是,原英文文档也是这样说。 zltzlt 发表于 2020-1-5 16:19
是,原英文文档也是这样说。
机翻的不一定准确,建议你逐词翻译一下 _2_ 发表于 2020-1-5 16:20
机翻的不一定准确,建议你逐词翻译一下
没有机翻{:10_277:}原文如图:
https://s2.ax1x.com/2020/01/05/lDer1H.png zltzlt 发表于 2020-1-5 16:19
是,原英文文档也是这样说。
许多翻译连 AI 都不一定翻译的准确,还是需要人为翻译,机器并不会感受语境 _2_ 发表于 2020-1-5 16:24
许多翻译连 AI 都不一定翻译的准确,还是需要人为翻译,机器并不会感受语境
KeyCode 不太常用,所以我没有说得那么详细{:10_277:}我也尽力了 zltzlt 发表于 2020-1-5 16:21
没有机翻原文如图:
@不二如是 来帮他翻译一下{:10_256:} 这个值得好好学习 学习学习,感谢楼主。 zltzlt 发表于 2020-1-5 10:29
@小甲鱼 更新完毕,申精
@一个账号 @henry2018 @_2_ 来看看吧
怎么被解除精华了? 想问一下如果输入的是中文字符怎么办,我输出的都是一些类似<101>这样的字符 wudanyangggo 发表于 2021-5-20 18:01
想问一下如果输入的是中文字符怎么办,我输出的都是一些类似这样的字符
请问解决了吗?如何监听输入中文呢
页:
[1]