我正在尝试编写一个简单的程序来显示不同键锁的当前状态,但我无法找到如何在 Python 中获取它们当前状态的解决方案。谢谢你。
7 回答
如果您可以等待一两天,我会将此功能添加到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}
正如@ronakxset
所提到的,使用要容易得多,因为您不必对任何输入设备具有读取权限。不幸的是,它只能在 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)]
获取设备上所有可用的 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)]
好的,在阅读了源代码python-keyboardleds
和console_ioctl
手册页之后,下面是如何用纯 Python 进行操作:
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
注意:这仅适用于真实终端和 VT(1-7,可通过ctrl++访问的终端alt)Fx,不适用于 X11 终端仿真器中的伪终端。
要检查,tty
请在控制台中运行:
$ tty
/dev/tty1 # will work
$ tty
/dev/pts/4 # won't work
/dev/console
用作查询设备也可以在 X11 中使用,但需要 root 权限。
有关所涉及概念的详细信息,请参阅有关ioctls和位掩码的 Wikipedia 页面,以及 Pythonfcntl
模块的文档。
└──> xset q | grep LED
auto repeat: off key click percent: 0 LED mask: 00000000
└──> xset q | grep LED
auto repeat: off key click percent: 0 LED mask: 00000001
当大写锁定打开时,LED 掩码应为 1,如果 LED 掩码关闭,则应为 0。
此外,由于您提到要使用 python,您可以通过以下方式获取值
>>> import commands
>>> # Caps Lock is off.
>>> commands.getoutput('xset q | grep LED')[65]
'0'
>>> # Setting Caps Lock on now.
>>> commands.getoutput('xset q | grep LED')[65]
'1'
蟒蛇3版本:
import subprocess
if subprocess.check_output('xset q | grep LED', shell=True)[65] == 50 :
capslock = False
if subprocess.check_output('xset q | grep LED', shell=True)[65] == 51 :
capslock = True
print( "capslock ON is : ", capslock )
另请参阅 tkinter - 有 Caps-Lock 的事件。当我打开面板时,我使用 xset 来查找 Caps-Lock 的初始状态,然后在面板打开时使用 tkinter 事件来跟踪。1)我不确定如何在 tkinter 中获得初始状态 - 一定有一种方法 2 xset 在 tkinter 事件过程中似乎不可靠 - 过程并不总是通过 xset 显示大写锁定更改......
示例代码:
def capsLock(event):
caps = event.state & 0x0002
另请参阅: Python - 如何获取当前的键锁状态?
如果您的操作系统是 Windows,请尝试:
import win32api,win32con
caps_status = win32api.GetKeyState(win32con.VK_CAPITAL)
if caps_status==0:
print('CapsLock is off')
else:
print('CapsLock is on')
为了扩展 ronak 提供的答案,python3 版本以它应该的方式工作,但仅在打开 num lock 时。
subprocess.check_output('xset q | grep LED', shell=True)[65]
根据 numlock 和 caps lock 的状态返回值 48 到 51(capslock 加 1,而 numlock 加 2)
考虑到数字锁定,这应该起作用:
import subprocess
x=subprocess.check_output('xset q | grep LED', shell=True)[65]
if x==48 or x==50:
print("caps off")
if x == 48:
print("num off")
else:
print("num on")
elif x==49 or x==51:
print("caps on")
if x == 49:
print("num off")
else:
print("num on")```