我正在尝试编写一个显示不同键锁的当前状态的简单程序,但我无法找到如何在Python中获取它们的当前状态的解决方案。谢谢。
答案 0 :(得分: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}
由@ronak提到的xset
使用起来要容易得多,因为您不必拥有任何输入设备的读取权限。不幸的是,它仅在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)]
答案 1 :(得分:4)
好的,在阅读source code for python-keyboardleds
和console_ioctl
manpage之后,这里是如何在纯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访问的终端和VT ),不适用于X11终端仿真器中的伪终端。
要检查,请在控制台中运行tty
:
$ tty
/dev/tty1 # will work
$ tty
/dev/pts/4 # won't work
使用/dev/console
作为查询设备也可以在X11中使用,但需要root权限。
有关所涉及概念的详细信息,请参阅ioctls和bitmasking上的维基百科页面以及Python fcntl
module的文档。
答案 2 :(得分:2)
└──> 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'
python 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 )
答案 3 :(得分:0)
另见tkinter - 它有Caps-Lock的事件。 当我打开面板时,我使用xset查找Caps-Lock的初始状态,然后在面板打开时使用tkinter事件跟踪。 1)我不知道如何在tkinter中获得初始状态 - 必须有一种方法 2 xset在tkinter事件过程中似乎不可靠 - proc并不总是通过xset显示大写锁定更改...
示例代码:
def capsLock(event):
caps = event.state & 0x0002
答案 4 :(得分:0)
为扩展ronak提供的答案,python3版本按应有的方式工作,但仅当打开 num lock时。
subprocess.check_output('xset q | grep LED', shell=True)[65]
返回值48到51,具体取决于numlock和caps锁定的状态(capslock的值为1,numlock的值为2)
这应该在考虑到numlock的情况下起作用:
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")```
答案 5 :(得分:0)
如果您的操作系统是Windows,请尝试:
import win32api,win32con
caps_status = win32api.GetKeyState(win32con.VK_CAPITAL)
if caps_status==0:
print('CapsLock is off')
else:
print('CapsLock is on')
答案 6 :(得分:0)
查看 https://stackoverflow.com/a/21160382/10871895 以获取 Windows 下的大写锁定键,无需加载其他模块。