Python - 如何获得当前的键锁状态?

6 python capslock

我正在尝试编写一个显示不同键锁的当前状态的简单程序,但我无法找到如何在Python中获取它们的当前状态的解决方案.谢谢.

gva*_*kov 6

如果你可以等一两天,我会将这个功能添加到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)


Luk*_*raf 5

好的,在阅读了和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模块的文档。


ron*_*nak 3

\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\n
Run 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\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

蟒蛇3版本:

\n\n
import 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 )\n
Run Code Online (Sandbox Code Playgroud)\n

  • 从文档中,“自版本 2.6 以来已弃用:命令模块已在 Python 3 中删除。请改用 subprocess 模块。” (6认同)