wxpython don';无法捕获EVT\u帮助

wxpython don';无法捕获EVT\u帮助,python,events,wxpython,keyboard-events,Python,Events,Wxpython,Keyboard Events,我有一个小问题,我正在使用FreeBSD,但这个问题也发生在linux上 我尝试使用F1键发送wx.EVT_帮助,但什么也没发生: import logging as log import wx class MainWindow(wx.Frame): def __init__(self, parent, title): wx.Frame.__init__(self, parent, title=title, size=(200,100)) self.B

我有一个小问题,我正在使用FreeBSD,但这个问题也发生在linux上

我尝试使用F1键发送wx.EVT_帮助,但什么也没发生:

import logging as log
import wx

class MainWindow(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(200,100))

        self.Bind(wx.EVT_HELP, self.function)
        self.SetFocus()
        self.Show(True)

    def function(self, event=None):
        print "drin"

if __name__ == "__main__":
    app = wx.App(False)
    gui = MainWindow(None, "test")
    app.MainLoop()
我用一块面板试过了,就像

但这也不起作用(在我的案例中,我希望阻止面板)。我知道的唯一可能性是使用wx.EVT_KEY_DOWN和panels或wx.CHAR_HOOK(在没有panels的情况下工作),但在这两种情况下,它们都会将每个keyevent绑定到我的函数,我只需要F1或者更确切地说wx.EVT_帮助

有人知道我如何将F1与wx.EVT_帮助连接起来,以便我的第一个代码可以工作吗

谢谢你的时间


谢谢你的帮助!加速器是我一直在寻找的东西!但我不明白为什么需要一个面板,我的测试代码

import logging as log
import wx

class MainWindow(wx.Frame):
    def __init__(self, parent, title):

        wx.Frame.__init__(self, parent, title=title, size=(200,100))
        wx.Panel(self, wx.ID_ANY)
        f1_id = wx.NewId()
        self.Bind(wx.EVT_MENU, self.function, id = f1_id)
        accel_tbl = wx.AcceleratorTable([(wx.ACCEL_NORMAL, wx.WXK_F1, f1_id)])
        self.SetAcceleratorTable(accel_tbl)
        self.SetFocus()
        self.Show(True)

    def function(self, event=None):
        print "drin"

if __name__ == "__main__":
    app = wx.App(False)
    gui = MainWindow(None, "test")
    app.MainLoop()

可以工作,但它甚至不使用面板。是否有可能围绕一个小组开展工作?或者(使用unix的)帧不够敏感,无法接收keyevents?(当我在测试代码中删除面板时,它不带任何键即可工作。)

您需要使用
wx.AcceleratorTable
。下面是一个简单的例子:

import logging as log
import wx

class MainWindow(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(200,100))

        self.panel = wx.Panel(self, wx.ID_ANY)
        self.panel.Bind(wx.EVT_HELP, self.function)

        f1_id = wx.NewId()
        self.Bind(wx.EVT_MENU, self.function, id=f1_id)
        accel_tbl = wx.AcceleratorTable([(wx.ACCEL_NORMAL, wx.WXK_F1, f1_id )])
        self.SetAcceleratorTable(accel_tbl)

        self.Show(True)

    def function(self, event=None):
        print "drin"

if __name__ == "__main__":
    app = wx.App(False)
    gui = MainWindow(None, "test")
    app.MainLoop()
这对我来说适用于wxPython 3.0.2。使用Python 2.7.12在Xubuntu 16.04上实现经典

有关此主题的更多信息:


您有没有使用过将密钥绑定到事件的方法?您好,Mike Driscoll,再次感谢您的帮助。AcceleratorTable适用于我,但我有一个关于面板的问题,我在第一个问题中写道。我不确定为什么需要面板(可能不取决于操作系统),但您几乎总是希望在
wx.Frame
中有一个。原因是,如果我没记错的话,该面板将为框架提供跨平台的正确外观,并在小部件之间启用选项卡。EVT_帮助事件通常不会自动绑定到F1。你需要帮点忙,就像迈克用加速表展示的那样,或者用其他方法处理它。但是,如果您有一个wx.ContextHelpButton,或者自己使用wx.ContextHelp类,那么您将获得EVT_帮助事件。有关更多详细信息,请参阅文档和演示。
import logging as log
import wx

class MainWindow(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(200,100))

        self.panel = wx.Panel(self, wx.ID_ANY)
        self.panel.Bind(wx.EVT_HELP, self.function)

        f1_id = wx.NewId()
        self.Bind(wx.EVT_MENU, self.function, id=f1_id)
        accel_tbl = wx.AcceleratorTable([(wx.ACCEL_NORMAL, wx.WXK_F1, f1_id )])
        self.SetAcceleratorTable(accel_tbl)

        self.Show(True)

    def function(self, event=None):
        print "drin"

if __name__ == "__main__":
    app = wx.App(False)
    gui = MainWindow(None, "test")
    app.MainLoop()