Wxpython检测大写锁定状态

时间:2019-12-22 13:37:29

标签: python python-3.x wxpython

我在wxpython(python-3)中构建了一个GUI。有人知道如何检测Caps Lock是打开还是关闭? 类似于此代码,但带有CapsLock。

event.CmdDown() 

2 个答案:

答案 0 :(得分:0)

这取决于您为什么想知道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将返回(对应于ASCII字符的含义是从GetKeyCode或GetUnicodeKey)键码97,对应于ASCII值。一种 。并且如果按下相同的键但按住Shift键(或同时按下Caps Lock键),则该键可能为65,即大写字母A的ASCII值。

     

但是对于键按下和向上事件,返回的键码将改为A,而与修改键的状态无关,即,它仅取决于按下的物理键,并且不会使用当前的键盘状态转换为逻辑键。此类未翻译的键码定义如下:

     

对于字母,它们对应于字母的大写值。   对于其他字母数字键(例如7或+),未翻译的键控代码对应于在没有Shift的情况下按下该键时所产生的字符。例如。在美国标准键盘布局中,键盘右上角的= / +键的未翻译键码为61,即=的ASCII值。   对于其余的键(即特殊的不可打印的键),它与普通键代码相同,因为无论如何都不会使用翻译。   请注意,第一个规则适用于所有Unicode字母,而不仅仅是通常的Latin-1字母。但是,对于非拉丁1字母,只能使用GetUnicodeKey来检索密钥代码,因为在这种情况下,GetKeyCode只会返回WXK_NONE。

     

总结:如果需要翻译后的键,则应该处理wxEVT_CHAR;如果只需要键本身的值,则应处理wxEVT_KEY_DOWN,而与当前的键盘状态无关。

下面是一些测试代码,用于隔离您要执行的操作。
请注意,对于Capslock键的初始测试仅在使用X的Linux上有效。对于其他OS,则可能必须使用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中解绑结果的方式可能会有所不同。

答案 1 :(得分:0)

我找到了一种很好的检查方法:

from win32api import GetKeyState
from win32con import VK_CAPITAL
def caps_on():
    return GetKeyState(VK_CAPITAL) == 1