我正在尝试编写一个显示不同键锁的当前状态的简单程序,但我无法找到如何在Python中获取它们的当前状态的解决方案.谢谢.
如果你可以等一两天,我会将这个功能添加到python-evdev并更新这个答案.它可能会看起来像以下几点:
from evdev import InputDevice, ecodes
dev = InputDevice('/dev/input/eventX') # your keyboard device
dev.ledstates(verbose=True)
{ (0, 'LED_NUML') : True,
(1, 'LED_CAPSL') : True,
(2, 'LED_SCROLLL') : False}
Run Code Online (Sandbox Code Playgroud)
使用xset,如@ronak提到的,是容易得多,因为你不必有任何输入设备读取权限.不幸的是,它仅在X下工作(而X又使用evdev接口(至少在Linux上)).
好吧,它花了我足够长的时间,但它已经进入.获得'ON'LED的界面最终成为:
>>> dev.leds()
[0, 1, 8, 9]
>>> dev.leds(verbose=True)
[('LED_NUML', 0), ('LED_CAPSL', 1), ('LED_MISC', 8), ('LED_MAIL', 9)]
Run Code Online (Sandbox Code Playgroud)
获取设备上所有可用的LED:
>>> dev.capabilities()[ecodes.EV_LED]
[0, 1, 2]
>>> dev.capabilities(verbose=True)[('EV_LED', ecodes.EV_LED)]
[('LED_NUML', 0), ('LED_CAPSL', 1), ('LED_SCROLLL', 2)]
Run Code Online (Sandbox Code Playgroud)
好的,在阅读了和manpage的源代码python-keyboardleds后,这里是如何在纯 Python 中执行此操作:console_ioctl
import os
import struct
import fcntl
DEVICE = '/dev/tty'
_KDGETLED = 0x4B31
scroll_lock = 0x01
num_lock = 0x02
caps_lock = 0x04
fd = os.open(DEVICE, os.O_WRONLY)
# ioctl to get state of leds
bytes = struct.pack('I', 0)
bytes = fcntl.ioctl(fd, _KDGETLED, bytes)
[leds_state] = struct.unpack('I', bytes)
# Use bitmask to check status caps_lock bit
status = leds_state & caps_lock != 0
print "Caps Lock is On: %s" % status
Run Code Online (Sandbox Code Playgroud)
注意:这仅适用于真正的终端和室速(1-7,那些具有可访问ctrl+ alt+ Fx)在例如一个X11终端模拟器,而不是伪终端。
要检查,请tty在您的控制台中运行:
$ tty
/dev/tty1 # will work
$ tty
/dev/pts/4 # won't work
Run Code Online (Sandbox Code Playgroud)
使用/dev/console的设备查询将在X11以及工作,但需要root权限。
有关所涉及概念的详细信息,请参阅有关ioctls和位掩码的 Wikipedia 页面以及Pythonfcntl模块的文档。
\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80> xset q | grep LED\n auto repeat: off key click percent: 0 LED mask: 00000000\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80> xset q | grep LED\n auto repeat: off key click percent: 0 LED mask: 00000001\nRun Code Online (Sandbox Code Playgroud)\n\n当大写锁定打开时,LED 掩码应为 1,如果 LED 掩码关闭,则应为 0。
\n\n另外,由于您提到您想使用 python,因此您可以通过以下方式获取该值
\n\n>>> import commands\n>>> # Caps Lock is off.\n>>> commands.getoutput(\'xset q | grep LED\')[65]\n\'0\'\n>>> # Setting Caps Lock on now.\n>>> commands.getoutput(\'xset q | grep LED\')[65]\n\'1\'\nRun Code Online (Sandbox Code Playgroud)\n\n蟒蛇3版本:
\n\nimport subprocess\nif subprocess.check_output(\'xset q | grep LED\', shell=True)[65] == 50 :\n capslock = False\nif subprocess.check_output(\'xset q | grep LED\', shell=True)[65] == 51 :\n capslock = True\nprint( "capslock ON is : ", capslock )\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
6369 次 |
| 最近记录: |