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
有关该主题的更多信息:
我有一个小问题,我使用的是 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
有关该主题的更多信息: