我在wxpython(python-3)中构建了一个GUI。有人知道如何检测Caps Lock是打开还是关闭? 类似于此代码,但带有CapsLock。
event.CmdDown()
答案 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