wxpython 不捕获 EVT_HELP

wxpython don't capture EVT_HELP

我有一个小问题,我使用的是 FreeBSD,但这个问题也出现在 linux 上。

我尝试使用 F1 键发送 wx.EVT_HELP,但没有任何反应:

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()

我用 wxpython can't capture EVT_KEY_DOWN enent

中的面板试过了
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)
        self.panel.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 与面板一起使用或 wx.CHAR_HOOK (在没有面板的情况下工作)但在这两种情况下它们将每个键事件绑定到我的函数我只想要 F1 或者更确切地说 wx.EVT_HELP .

有人知道我如何将 F1 连接到 wx.EVT_HELP,这样我的第一个代码就可以工作了吗?

感谢您的宝贵时间!


感谢您的帮助! 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))
        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)不够灵敏,无法接收按键事件? (当我在我的测试代码中删除面板时,它没有密钥。)

您需要使用 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。 Xubuntu 16.04 上的经典 Python 2.7.12

有关该主题的更多信息: