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

时间:2012-10-29 21:15:17

标签: python capslock

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

7 个答案:

答案 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-keyboardledsconsole_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权限。

有关所涉及概念的详细信息,请参阅ioctlsbitmasking上的维基百科页面以及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

另见: Python - How to get current keylock status?

答案 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 下的大写锁定键,无需加载其他模块。