8

さまざまなキーロックの現在のステータスを表示する簡単なプログラムを作成しようとしていますが、Pythonでキーロックの現在のステータスを取得する方法についての解決策を見つけることができません。ありがとうございました。

4

7 に答える 7

7

1日か2日待つことができる場合は、この機能を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では)インターフェイスを使用します)。


まあ、それは私に十分な時間がかかりました、しかしそれは入っています。「オン」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+ alt+でアクセス可能なものFx)でのみ機能し、たとえばX11端末エミュレーターの疑似端末では機能しません。

確認するには、コンソールで実行ttyします。

$ tty
/dev/tty1    # will work

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

クエリを実行するデバイスとして使用/dev/consoleすることはX11でも機能しますが、root権限が必要です。

関連する概念の詳細については、ioctlビットマスキングに関するウィキペディアのページ、および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

Caps Lockがオンの場合、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 )
于 2012-10-29T21:32:09.150 に答える
0

Caps-Lockのイベントがあるtkinterも参照してください。xsetを使用して、パネルを開いたときのCaps-Lockの初期ステータスを見つけ、次にtkinterイベントを使用して、パネルが開いている間追跡しました。1)tkinterで初期状態を取得する方法がわかりませんでした-2つのxsetがtkinterイベントproc内で信頼できないように見えた方法があるはずです-procは常にxsetを介してcaps-lockの変更を示していませんでした...

サンプルコード:

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

Python-現在のキーロックステータスを取得する方法も参照 してください。

于 2013-08-28T14:44:59.953 に答える
0

ronakが提供する答えを拡張するために、python3バージョンは正常に機能しますが、numlockがオンになっている場合に限ります。

subprocess.check_output('xset q | grep LED', shell=True)[65]numlockおよびcapslockのステータスに応じて、値48〜51を返します(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")```
于 2020-09-08T09:50:33.937 に答える
0

OSが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

追加のモジュールをロードせずにWindowsでCapsLockキーを確認するには、 https://stackoverflow.com/a/21160382/10871895をご覧ください。

于 2021-02-26T13:49:34.923 に答える