8

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

4

7 回答 7

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)]
于 2012-10-29T21:50:29.457 回答
5

好的,在阅读了源代码python-keyboardledsconsole_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++访问的终端altFx,不适用于 X11 终端仿真器中的伪终端。

要检查,tty请在控制台中运行:

$ tty
/dev/tty1    # will work

$ tty
/dev/pts/4   # won't work

/dev/console用作查询设备也可以在 X11 中使用,但需要 root 权限。

有关所涉及概念的详细信息,请参阅有关ioctls位掩码的 Wikipedia 页面,以及 Pythonfcntl模块的文档。

于 2012-10-29T23:26:35.957 回答
3
└──> 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 )
于 2012-10-29T21:32:09.150 回答
0

另请参阅 tkinter - 有 Caps-Lock 的事件。当我打开面板时,我使用 xset 来查找 Caps-Lock 的初始状态,然后在面板打开时使用 tkinter 事件来跟踪。1)我不确定如何在 tkinter 中获得初始状态 - 一定有一种方法 2 xset 在 tkinter 事件过程中似乎不可靠 - 过程并不总是通过 xset 显示大写锁定更改......

示例代码:

def capsLock(event):
   caps = event.state & 0x0002

另请参阅: Python - 如何获取当前的键锁状态?

于 2013-08-28T14:44:59.953 回答
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')
于 2020-11-19T02:40:45.740 回答
0

为了扩展 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")```
于 2020-09-08T09:50:33.937 回答
0

在 Windows 下查看https://stackoverflow.com/a/21160382/10871895的大写锁定键,无需加载其他模块。

于 2021-02-26T13:49:34.923 回答