さまざまなキーロックの現在のステータスを表示する簡単なプログラムを作成しようとしていますが、Pythonでキーロックの現在のステータスを取得する方法についての解決策を見つけることができません。ありがとうございました。
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)]
さて、のソースコードpython-keyboardleds
とconsole_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
モジュールのドキュメントを参照してください。
└──> 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 )
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-現在のキーロックステータスを取得する方法も参照 してください。
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")```
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')
追加のモジュールをロードせずにWindowsでCapsLockキーを確認するには、 https://stackoverflow.com/a/21160382/10871895をご覧ください。