[英]Wxpython Detect Caps Lock status
我在 wxpython (python-3) 中構建了一個 gui。 有人知道如何檢測 Caps Lock 是打開還是關閉? 類似於此代碼但帶有 CapsLock 的東西。
event.CmdDown()
這取決於您為什么想知道Caps lock
是否處於活動狀態。
如果您真的想知道它是否處於活動狀態,則必須專門對其進行測試。
如果您需要警告大寫字母而不是小寫字母,那么您可以簡單地測試大寫字母。
您需要閱讀不同事件類型的wx.KeyEvent
的詳細信息。 尤其:
建議始終使用 GetUnicodeKey 並且僅在 GetUnicodeKey 返回 WXK_NONE 意味着該事件對應於不可打印的特殊鍵時才回退到 GetKeyCode。
雖然這兩個函數都可以與 wxEVT_KEY_DOWN 、 wxEVT_KEY_UP 和 wxEVT_CHAR 類型的事件一起使用,但是它們返回的值對於前兩個事件和最后一個事件是不同的。 對於后者,如果用戶按下其中的鍵,則返回的鍵對應於將出現在例如文本區域中的字符。 因此,它的值取決於 Shift 鍵的當前狀態,對於字母,取決於 Caps Lock 修飾符的狀態。 例如,如果在沒有按住 Shift 鍵的情況下按下 A 鍵,則為此按鍵生成的 wxEVT_CHAR 類型的 wx.KeyEvent 將返回(來自 GetKeyCode 或 GetUnicodeKey,因為它們對 ASCII 字符的含義一致)對應於 ASCII 值的 97 鍵代碼一種 。 如果按下相同的鍵但按住 Shift (或 Caps Lock 處於活動狀態),則鍵可能是 65,即大寫 A 的 ASCII 值。
然而,對於鍵按下和按下事件,返回的鍵代碼將改為獨立於修飾鍵的狀態的 A,即它僅取決於被按下的物理鍵,而不是使用當前鍵盤狀態轉換為其邏輯表示。 此類未翻譯的密鑰代碼定義如下:
對於字母,它們對應於字母的大寫值。 對於其他字母數字鍵(例如 7 或 + ),未翻譯的鍵代碼對應於在不按 Shift 的情況下按下該鍵時產生的字符。 例如,在標准的美式鍵盤布局中,鍵盤右上角 =/+ 鍵的未翻譯鍵碼是 61,它是 = 的 ASCII 值。 對於其余的鍵(即特殊的不可打印鍵),它與普通鍵代碼相同,因為無論如何都沒有使用翻譯。 請注意,第一條規則適用於所有 Unicode 字母,而不僅僅是通常的 Latin-1 字母。 但是,對於非拉丁 1 字母,只有 GetUnicodeKey 可用於檢索密鑰代碼,因為在這種情況下 GetKeyCode 僅返回 WXK_NONE。
總結一下:如果您需要翻譯的鍵,您應該處理 wxEVT_CHAR,如果您只需要鍵本身的值,則應該處理 wxEVT_KEY_DOWN,而與當前鍵盤狀態無關。
這是一些用於隔離您想要執行的操作的測試代碼。
請注意,大寫鎖定鍵的初始測試僅適用於使用 X 的 Linux。對於其他操作系統,您可能必須使用evdev
from evdev import InputDevice, ecodes
led = InputDevice('/dev/input/event5').leds(verbose=True) # eventX your keyboard
print("evdev :", led)
測試程序:
import wx
import subprocess
x = subprocess.check_output('xset q | grep Caps', shell=True)
x = str(x.decode().strip()).split(':')
res = None
for idx, elem in enumerate(x):
if "Caps " in elem:
res = x[idx+1]
if "off" in res:
capslock = False
else:
capslock = True
class MyFrame(wx.Frame):
def __init__(self, parent, id=wx.ID_ANY, title="", size=(360,100)):
super(MyFrame, self).__init__(parent, id, title, size)
self.panel = wx.Panel(self)
self.panel.Bind(wx.EVT_KEY_DOWN, self.OnKey)
self.panel.Bind(wx.EVT_CHAR, self.OnKey)
self.Show()
def OnKey(self, event):
global capslock
keycode = event.GetKeyCode()
unicode = event.GetUnicodeKey()
capital = ""
if unicode >= 65 and unicode <= 90:
capital = "Caps"
print("key",keycode)
print("uni",unicode, capital)
if keycode == 311:
print("Shift Lock Toggled")
capslock = not capslock
print(capslock)
event.Skip()
if __name__ == "__main__":
app = wx.App()
frame = MyFrame(None,title="The Main Frame")
app.MainLoop()
注意:從xset q
綁結果的方式可能會有所不同,具體取決於您的操作系統和版本。
我找到了一個很好的方法來檢查它:
from win32api import GetKeyState
from win32con import VK_CAPITAL
def caps_on():
return GetKeyState(VK_CAPITAL) == 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.