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