检查钥匙是否按下,wxpython?

检查钥匙是否按下,wxpython?,wxpython,Wxpython,你好,我想知道是否有一种方法可以检查某把钥匙是否被按下 下面是一个例子 self.button2.Bind(wx.EVT_LEFT_DOWN, self.clickedbutton) def clickedbutton(self, e): if (Control is held down while the button has been clicked): print "it works" 谢谢仅使用wx的问题在于,您需要一个KeyEvent来访问控制键的实际状态。由

你好,我想知道是否有一种方法可以检查某把钥匙是否被按下

下面是一个例子

self.button2.Bind(wx.EVT_LEFT_DOWN, self.clickedbutton)
def clickedbutton(self, e):
    if (Control is held down while the button has been clicked):
        print "it works"

谢谢

仅使用wx的问题在于,您需要一个KeyEvent来访问控制键的实际状态。由于您需要此类事件之外的信息,因此需要手动跟踪它,问题是很容易错过KeyEvent,因为只有聚焦控件才能获取这些信息,并且您无法指望它们传播

如果您在windows上,最简单的方法是使用特定于平台的方式查询此信息,请查看pyHook或win32api

在某些情况下,虽然wx-only方法可以工作,但以下是您的工作方式:

import wx


class Example(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None)

        btn = wx.Button(self, label="press me")
        self.Sizer = wx.BoxSizer()
        self.Sizer.Add(btn)

        self.ctrl_down = False

        self.Bind(wx.EVT_KEY_UP, self.OnUpdateCtrlState)
        self.Bind(wx.EVT_KEY_DOWN, self.OnUpdateCtrlState)
        btn.Bind(wx.EVT_KEY_UP, self.OnUpdateCtrlState)
        btn.Bind(wx.EVT_KEY_DOWN, self.OnUpdateCtrlState)
        btn.Bind(wx.EVT_BUTTON, self.OnButton)

    def OnUpdateCtrlState(self, event):
        self.ctrl_down = event.ControlDown()
        print self.ctrl_down
        event.Skip()

    def OnButton(self, event):
        if self.ctrl_down:
            wx.MessageBox("control down")


app = wx.App(False)
app.TopWindow = f = Example()
f.Show()
app.MainLoop()

这在我正在构建的wx应用程序中有效,而且似乎是正确的。我忍不住想知道这是不是被忽视了(你的解决方案比公认的答案更直接、更容易理解),或者是否存在某种限制,使其无法成为正确的答案。我投了赞成票,并打算做一些测试/研究。@g.d.d.c嘿,谢谢你,这种方法很好。另一个答案在我回答时已经被接受了,这就是为什么。尽管可以随意测试/研究,但始终是一个好主意:)@g.d.d.c Ok刚刚检查了获取键的状态(如果按下或切换,则为true;如果未按下或切换,则为false)。获取修改器或切换键的状态通常是最有用的。在某些平台上,这些可能是此功能能够检测到的唯一密钥。我不知道它指的是什么平台,但是像Ctrl、alt等键(修改键)应该可以很好地工作。我想如果你用它来检测普通的钥匙,一定要小心。这个答案帮我省去了很多麻烦!谢谢。在windows上,我可以检测到一个普通的密钥。我建议重新阅读一些答案。除非我遗漏了什么,否则其他的一个比公认的更干净、更便携,并且在我的早期测试中有效。
self.button2.Bind(wx.EVT_LEFT_DOWN, self.clickedbutton)
def clickedbutton(self, e):
    if wx.GetKeyState(wx.WXK_CONTROL):
        print "it works"