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

Я предлагаю перечитывая некоторые из ответов. Если нет чего-то, что я пропустил, один из других, чем принятый, является более чистым, более портативным и работает в моих ранних тестах. –

ответ

2

Проблема с использованием только WX для этого является то, что вам нужно, чтобы получить доступ KeyEvent фактического состояния ключа управления. Поскольку вам нужна эта информация за пределами такого события, вам нужно отслеживать ее вручную, и проблема заключается в том, что легко пропустить KeyEvent, так как только сфокусированные элементы управления получают их, и вы не можете рассчитывать на их распространение.

Простой способ - использовать какой-либо конкретный способ запроса этой информации на платформе, если вы находитесь в окнах, смотрите на 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

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, которые я создаю, и кажется правильным. Я не могу не задаться вопросом, не игнорируется ли это (ваше решение гораздо более прямое и доступное, чем принятый ответ), или если есть какое-то ограничение где-то, что исключает это как правильный ответ. Я проголосовал и намерен провести некоторые исследования и исследования. –

+0

@ g.d.d.c Эй, спасибо, этот метод в порядке. Другой ответ был уже принят, когда я ответил, вот почему. Не стесняйтесь тестировать хотя/исследование, хотя всегда хорошая идея :) – GP89

+0

@gddc Хорошо только проверил [docs] (http://wxpython.org/docs/api/wx-module.html#GetKeyState) _Установить состояние ключ (true, если нажата или включена, ложь, если нет). Обычно это полезно для получения состояния модификатора или клавиш переключения. ** На некоторых платформах это могут быть единственные ключи, которые эта функция может обнаружить ** ._ Я не знаю, на каких платформах он ссылается, но такие клавиши, как Ctrl, Alt и т. Д. (Ключи-модификаторы) должны работать хорошо, к этому. Я думаю, будьте осторожны, если вы обнаружите с ним обычные ключи. – GP89

Смежные вопросы