我在wxpython (python-3)中构建了一个gui。有人知道如何检测Caps是开着还是关着?类似于这段代码,但使用了CapsLock。
event.CmdDown() 发布于 2019-12-29 21:11:13
我找到了一种很好的检查方法:
from win32api import GetKeyState
from win32con import VK_CAPITAL
def caps_on():
return GetKeyState(VK_CAPITAL) == 1发布于 2019-12-28 18:37:45
这取决于为什么您想知道Caps lock是否是活动的。
如果你真的想知道它是否是活动的,你必须专门测试它。
如果您需要警告大写字母而不是小写字母,那么您可以简单地测试大写字母。
您需要了解不同事件类型的wx.KeyEvent的详细信息。值得注意的是:
建议始终使用GetUnicodeKey,如果GetUnicodeKey返回WXK_NONE,则只返回WXK_NONE,这意味着事件对应于不可打印的特殊键。
虽然这两个函数都可以与wxEVT_KEY_DOWN、wxEVT_KEY_UP和wxEVT_CHAR类型的事件一起使用,但是它们对前两个事件和最后一个事件返回的值是不同的。对于后者,返回的键对应于用户按下其中的键时将出现在例如文本区域中的字符。因此,它的值取决于Shift键的当前状态,对于字母,取决于Caps修饰符的状态。例如,如果按下键而不按住移位,则为该键按下生成的wx.KeyEvent类型的wxEVT_CHAR将返回(来自GetKeyCode或GetUnicodeKey,因为它们对ASCII字符的含义重合)对应a的ASCII值的97键代码。如果按下相同的键,但持有Shift (或者Caps是活动的),则键可以是65,即ASCII的大写A值。
但是,对于向下键和向上键事件,返回的键代码将是A,而不依赖于修饰符键的状态,也就是说,它只依赖于被按下的物理键,并且不使用当前键盘状态转换为其逻辑表示形式。这些未翻译的密钥代码定义如下:
对于字母,它们对应于字母的大写值。对于其他字母数字键(例如7或+ ),未翻译的密钥代码对应于键在不移位的情况下按下时产生的字符。例如,在标准的US键盘布局中,键盘右上角的键=/+的未翻译键代码是61,这是=的ASCII值。对于其余的键(即特殊的不可打印键),它与普通密钥代码相同,因为无论如何都不使用转换。请注意,第一条规则适用于所有Unicode字母,而不仅仅是通常的拉丁文-1。但是,对于非拉丁字母,只有GetUnicodeKey可以用于检索密钥代码,因为GetKeyCode在本例中只返回WXK_NONE。
总之:如果需要翻译的键,则应该处理wxEVT_CHAR;如果只需要键本身的值,则应该处理wxEVT_KEY_DOWN,这与当前的键盘状态无关。
下面是一些用于隔离您想要做的事情的测试代码。
注意,capslock键的初始测试仅在Linux上使用X。对于其他操作系统,您可能必须使用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解压缩结果可能有所不同。
https://stackoverflow.com/questions/59444665
复制相似问题