如何确定在wxPython事件处理程序中是否按下了Shift键?

时间:2014-01-07 15:44:15

标签: python wxpython

我有一个自定义对话框,上面有几个按钮。由于我想保持它很小,我想如果每个按钮尽可能多地执行操作,因此,如果在单击时按下shift键,我希望按钮的行为不同。根据文档的this页面,keyevent具有ShiftDown()函数,如果按下shift键,则返回true。唯一的问题是我的按钮和处理程序是由wx.EVT_BUTTON绑定的,这是一个没有这种属性的命令事件。有没有办法让命令事件携带有关shift键的信息,或者以某种方式将其传递给处理程序?提前致谢

1 个答案:

答案 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上测试