我有一个自定义对话框,上面有几个按钮。由于我想保持它很小,我想如果每个按钮尽可能多地执行操作,因此,如果在单击时按下shift键,我希望按钮的行为不同。根据文档的this页面,keyevent
具有ShiftDown()
函数,如果按下shift键,则返回true。唯一的问题是我的按钮和处理程序是由wx.EVT_BUTTON
绑定的,这是一个没有这种属性的命令事件。有没有办法让命令事件携带有关shift键的信息,或者以某种方式将其传递给处理程序?提前致谢
答案 0 :(得分:2)
基本上你需要绑定到其他几个事件,特别是wx.EVT_KEY_DOWN和wx.EVT_KEY_UP,这样你就可以知道shift键何时上升或下降。查看以下代码:
import wx
########################################################################
class MyPanel(wx.Panel):
""""""
#----------------------------------------------------------------------
def __init__(self, parent):
"""Constructor"""
wx.Panel.__init__(self, parent)
self.shift_down = False
btn = wx.Button(self, label="Test Shift")
btn.Bind(wx.EVT_KEY_DOWN, self.onKeyDown)
btn.Bind(wx.EVT_KEY_UP, self.onKeyUp)
btn.Bind(wx.EVT_BUTTON, self.onButton)
#----------------------------------------------------------------------
def onButton(self, event):
"""
Event handler for when the button is pressed
"""
if self.shift_down:
print "Shift key is down!"
else:
print "Shift key is up!"
#----------------------------------------------------------------------
def onKeyDown(self, event):
"""
If shift key is down, set class variable to True
"""
keycode = event.GetKeyCode()
if keycode == wx.WXK_SHIFT:
self.shift_down = True
event.Skip()
#----------------------------------------------------------------------
def onKeyUp(self, event):
"""
If shift key is up, set class variable to False
"""
keycode = event.GetKeyCode()
if keycode == wx.WXK_SHIFT:
self.shift_down = False
event.Skip()
########################################################################
class MyFrame(wx.Frame):
""""""
#----------------------------------------------------------------------
def __init__(self):
"""Constructor"""
wx.Frame.__init__(self, None, title="Demo")
panel = MyPanel(self)
self.Show()
#----------------------------------------------------------------------
if __name__ == "__main__":
app = wx.App(False)
frame = MyFrame()
app.MainLoop()
使用Python 2.6.6和wxPython 2.8在Windows 7上测试