Wxpython 使用Command-W或Control-W关闭帧
我有一个wx.Frame子类,用户应该能够通过按Command-W(在OSX上)或Control-W(在Windows上)来关闭它。我的代码看起来像Wxpython 使用Command-W或Control-W关闭帧,wxpython,wxwidgets,Wxpython,Wxwidgets,我有一个wx.Frame子类,用户应该能够通过按Command-W(在OSX上)或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 ev
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\u键
不执行任何操作,直到我通过单击帧来聚焦帧。之后,按a键触发handle\u键,但Ctrl和W键触发函数的单独调用,因此条件永远不会满足
在OSX下,任何按键都不会调用handle\u key
,即使我在框架内单击以设置焦点后也是如此
我如何实现这个按键处理程序以便
它的行为在不同平台上是一致的,除了Ctrl和Cmd,以及
当帧
位于最前面时,用户可以随时按下组合键,而不管哪个窗口实际具有焦点
你应该使用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)
使用加速器表的建议很好。但是为了完整性,如果您确实需要处理Ctrl/Cmd+W,那么您的代码应该如下所示:
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)
def handle_键(self,event):
如果event.GetKeyCode()='W'和event.GetModifiers()==wxMOD\U控件:
# ... 无论什么
请注意,wxMOD\u控件
在Mac下实际上是Cmd(并且您有一个单独的wxMOD\u RAW\u控件
,如果您确实想在所有平台下使用Ctrl键,可以使用该控件)。使用Command-W或CONTROL-W关闭帧
使用Ctrl-W关闭wx.Frame的简单示例:
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()
资料来源: