首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python在Linux中访问键盘LED的替代方法

使用Python在Linux中访问键盘LED的替代方法
EN

Stack Overflow用户
提问于 2013-03-26 05:43:35
回答 1查看 2.3K关注 0票数 2

我已经在Linux中创建了一个Python程序,它可以使NumLock发光二极管闪烁。代码如下所示:

代码语言:javascript
复制
import fcntl
import os
import time

# Define variables for keyboard and NUM_LOCK LED
KDSETLED = 0x4B32
NUM_LED = 0x02

# Open the "keyboard console" for LED toggling
console_fd = os.open('/dev/console', os.O_NOCTTY)

def blink(tme, cnt):
    secs = tme/cnt
    for i in range(cnt):
        fcntl.ioctl(console_fd, KDSETLED, 0)
        time.sleep(secs)
        fcntl.ioctl(console_fd, KDSETLED, NUM_LED)
        if i < cnt - 1:
            time.sleep(secs)

blink(0.5,1)

如果它看起来有点眼熟,那是因为它来自一个类似的here帖子。

它正确地闪烁,为我的一个开机!USB数字键盘(部件号:G54-41403)。然而,虽然程序运行没有任何错误,但我的旧键盘的LED不闪烁(我还验证了NUM锁是否正常工作)。老款键盘是带有USB集线器的Targus数字键盘(请注意,我在网上找不到我的老款PAUK10U ),还有一个Rlip符合人体工程学的键盘KNP-180

我检查了Python模块python-keyboardleds (链接here),发现程序直接访问键盘。具体地说,当我通过/dev/console访问它时,程序通过/dev/input/by-path/访问它。我尝试更改代码,以便打开列表中的第一个键盘,结果与之前相同(没有错误,其他键盘型号的LED也不闪烁)。我写的代码如下所示:

代码语言:javascript
复制
#LEDToggle.py

import argparse
import glob
import grp
import os
import pwd
import re
import subprocess
import time
import fcntl
import keyboardleds

def drop_privileges():
    uid = pwd.getpwnam('nobody').pw_uid
    gid = grp.getgrnam('nogroup').gr_gid
    os.setgid(gid)
    os.setuid(uid)

def parse_args():
    led_names = list(t + '-lock' for t in ('caps', 'num', 'scroll'))
    ap = argparse.ArgumentParser()
    ap.add_argument('--led', choices=led_names, default=led_names[1],
    help='keyboard LED to use',
    )
    return ap.parse_args()

def blink(tme, cnt):
    secs = tme/cnt
    options = parse_args()
    event_device = glob.glob('/dev/input/by-path/*-event-kbd')[0]
    ledkit = keyboardleds.LedKit(event_device)
    drop_privileges()
    #led = getattr(ledkit, 'num-lock')
    led = getattr(ledkit, options.led.replace('-', '_'))
    for i in range(cnt):
        led.reset()
        print "off"
        time.sleep(secs)
        led.set()
        print "on"
        if i < cnt - 1:
            time.sleep(secs)

blink(5,5)

经过研究,我怀疑访问/dev/console时某些键盘调用不正确。当我查看/dev/input/by-path/时,我发现工作键盘名为platform-bcm2708_usb-usb-0:1.3:1.0-event-kbd。然后,当我尝试连接两个无法工作的键盘之一时,它们具有相同的名称。

我还尝试在内核中使用setleds命令,以及调用控制台和tty7来与键盘通信。这两个都做了同样的事情;他们在Power Up上工作!键盘和(没有任何错误)在其他两个键盘上没有闪烁。

我觉得我不能正确地与这些老键盘沟通。除了我尝试过的以外,有没有其他方法可以切换键盘LED?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-26 06:24:48

如果setleds不工作,最有可能的问题是你的两个旧键盘没有可编程访问的LEDs或者,如果它们有,它们不能通过linux控制台驱动程序访问。

事实上,这些是小键盘,旨在与完整的键盘(通常已经有自己的LED)一起使用,这可能使这似乎是一个合理的设计决定。

除非您想尝试在USB级别直接与键盘通信,否则我认为您已经完成了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15625367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档