2011-12-28 62 views
2

你好,我想知道是否有办法检查某个键是否被按下。检查是否按住键,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" 

感谢

+0

我建议重读一些答案。除非我错过了一些东西,否则接受的其中一个更清洁,更便携,并在我的早期测试中工作。 – 2013-01-08 07:16:40

回答

2

只使用问题WX这是你需要的KeyEvent访问控制键的实际状态。既然你需要在这样的事件之外的这些信息,你需要手动跟踪它,并且问题在于很容易错过KeyEvent,因为只有集中控制才能获得它们,并且你不能指望它们传播。

万无一失的方法是利用一些特定于平台的方式来查询这些信息,如果你在windows上查看pyHook或win32api的话。

在某些情况下,虽然仅WX方法能够工作,这里是你如何做到这一点:

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() 
+0

啊我明白了,谢谢你我的朋友! – thelost 2011-12-28 13:49:27

6
self.button2.Bind(wx.EVT_LEFT_DOWN, self.clickedbutton) 
def clickedbutton(self, e): 
    if wx.GetKeyState(wx.WXK_CONTROL): 
     print "it works" 
+0

这适用于我正在构建的wx应用程序,并且看起来正确。我不禁想知道这是否被忽视(你的解决方案比直接接受的答案更直接,更容易获取),或者在某些地方存在某些限制,将其排除在正确的答案之外。我投了票,并打算做一些测试/研究。 – 2013-01-08 07:14:58

+0

@ g.d.d.c嘿,谢谢你,这种方法很好。我回答时已经接受了另一个答案,这就是为什么。尽管测试尽管/研究虽然,总是一个好主意:) – GP89 2013-01-08 22:27:55

+0

@gddc好吧,刚刚检查了[文档](http://wxpython.org/docs/api/wx-module.html#GetKeyState)_获取状态一个键(如果按下或切换则为真,否则为假)。这通常是最有用的获取修饰键或切换键的状态。 **在某些平台上,这些函数可能是唯一可以检测到的键** ._我不知道它指的是哪个平台,但Ctrl,Alt等键(修饰键)应该工作得很好,对此。如果您使用它检测常规密钥,我想要小心一点。 – GP89 2013-01-08 22:34:08