簡體   English   中英

Wxpython 檢測大寫鎖定狀態

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM