【问题标题】:How do I determine if the Shift key was pressed in wxPython event handler?如何确定在 wxPython 事件处理程序中是否按下了 Shift 键?
【发布时间】:2014-01-08 00:01:59
【问题描述】:

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

【问题讨论】:

    标签: python wxpython


    【解决方案1】:

    基本上,您需要绑定到其他几个事件,特别是 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()
    

    在 Windows 7 上使用 Python 2.6.6 和 wxPython 2.8 测试

    【讨论】:

    • 很棒,就像一个魅力。你的名字已经成为 wxPython 的代名词了!
    • 嗯 - 尝试将相同的逻辑应用于 wx.MenuItem 似乎没有任何效果:def onKey(s, e): s.keyEvent = e; e.Skip(); print 'eek' 然后 myFrame.Bind(wx.EVT_KEY_DOWN, onKey, menuItem) 也尝试了 wx.EVT_LEFT_DOWN 具有相同的 noop 结果
    • 鼠标点击可能会覆盖捕获字符事件的能力...不过我不确定
    猜你喜欢
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多