我有一个wx.Frame子类,用户应该可以通过按下Command-W(在OS X上)或Control-W(在Windows上)来关闭它。我的代码看起来像
def MyWindow(wx.Frame):
def __init__(self):
# ...
self.Bind(wx.EVT_KEY_DOWN, self.handle_key)
# ...
def handle_key(self, event):
if event.GetKeyCode() == wx.WXK_CONTROL_W:
self.Destroy()
在Windows下,handle_key
在点击Frame
之前无法执行任何操作。之后,按一个键会触发handle_key
,但 Ctrl 和 W 会触发函数的单独调用,因此永远不会满足条件。
在OS X下,永远不会为任何按键调用handle_key
,即使我在Frame
内单击以设置焦点也不会。
如何实现此按键处理程序以便
Frame
最前面的任何时候按下组合键,而不管哪个窗口实际上有焦点?答案 0 :(得分:1)
您应该使用AcceleratorTable而不是尝试自己捕捉按键。这是指向文档的链接:
您可能也会发现本教程也很有用:
在您的情况下,代码看起来像这样:
exitId = wx.NewId()
self.Bind(wx.EVT_MENU, self.onExit, id=exitId )
accel_tbl = wx.AcceleratorTable([(wx.ACCEL_CTRL, ord('W'), exitMenuItem.GetId()) ])
self.frame.SetAcceleratorTable(accel_tbl)
答案 1 :(得分:1)
使用加速器表的建议很好。但为了完整性,如果你真的需要处理 Ctrl / Cmd + W ,你的代码应如下所示:
def handle_key(self, event):
if event.GetKeyCode() == 'W' and event.GetModifiers() == wxMOD_CONTROL:
# ... whatever ...
请注意,wxMOD_CONTROL
在Mac下实际上是 Cmd (如果你真的想要 Ctrl ,你可以使用单独的wxMOD_RAW_CONTROL
所有平台)。
答案 2 :(得分:0)
使用Command-W或Control-W关闭框架
使用Ctrl-W关闭wx.Frame的Barebones示例:
import wx
class MyForm(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY, "Tutorial", size=(500,500))
panel = wx.Panel(self, wx.ID_ANY)
#attach the key bind event to accellerator table
randomId = wx.NewId()
self.Bind(wx.EVT_MENU, self.onKeyCombo, id=randomId)
accel_tbl = wx.AcceleratorTable([(wx.ACCEL_CTRL, ord('W'), randomId )])
self.SetAcceleratorTable(accel_tbl)
#method invoked on key press
def onKeyCombo(self, event):
print "You pressed CTRL+W!"
self.Destroy()
if __name__ == "__main__":
app = wx.App(False)
frame = MyForm()
frame.Show()
app.MainLoop()
来源:https://www.blog.pythonlibrary.org/2010/12/02/wxpython-keyboard-shortcuts-accelerators