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

标签 python wxpython

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

最佳答案

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

关于python - 如何确定 wxPython 事件处理程序中是否按下了 Shift 键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20975846/

相关文章:

python - 是否可以使用wx.toolbar在wxPython中单击后执行事件?

python - 按行中的子字符串对 DataFrame 进行排序

python - 为什么nodejs和python中符号 '😃'的unicode值不同?

Python 压缩一个子文件夹而不是整个文件夹路径

python - 查看所有绑定(bind),wxpython

python - 在 wxPython 中,如何将 EVT_KEY_DOWN 事件绑定(bind)到整个窗口?

python:ValueError:关闭文件上的I/O操作

python - 将 html 表单数据获取到基于 django 类的 View 中

python - Pyinstaller无法构建wxpython应用程序,缺少错误wx._xml

python - Python 3 Miniconda 环境上的 wxPython