2011-12-28 29 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