如何在wxPython中以编程方式下拉wx.Menu

3 投票
3 回答
745 浏览
提问于 2025-04-17 21:10

如果我有一个 wx.Menu(在 wx.MenuBar 中,位于窗口的顶部,就像正常的菜单一样)——我该怎么做才能让这个菜单下拉并获得焦点,而不需要点击它。我想要的效果就像用户按下了这个菜单的快捷键一样(比如说,按 Alt+F 来打开 &文件 菜单)。

3 个回答

0

要在你的程序中为菜单定义快捷键,可以通过下面的例子来理解。

例子:

file_menu=wx.Menu()
menubar=wx.MenuBar()
menubar.Append(file_menu,"&File")  
self.SetMenuBar(menubar)

现在我们可以通过按下 ALT+F 来访问文件菜单。

如果还有其他菜单,当你按下 ALT 键时,它会指向菜单栏中每个菜单的第一个字母,然后你可以根据菜单项的名字按下下一个键。

2

我之前也遇到过类似的需求,发现使用PopupMenu函数是个简单的方法。这个函数不是从菜单对象调用的,而是从菜单的父级(比如窗口、框架等)来调用。

为了确保菜单能在特定的位置出现,不管你的鼠标在哪里,都可以给PopupMenu函数传一个位置参数。

在下面的例子中,我把一个按钮(platebtn)改成了无论你点击它的哪个地方,都能打开菜单,而不仅仅是在右侧的小箭头区域。

例子:

import wx
import wx.lib.platebtn as platebtn
class MyFrame(wx.Frame):
    def __init__(self, parent, ID, title):
        wx.Frame.__init__(self, parent, ID, title, size=(300, 250))
        wx.Panel(self,-1, style=wx.SUNKEN_BORDER)
        droparrow = platebtn.PB_STYLE_DROPARROW | platebtn.PB_STYLE_SQUARE | platebtn.PB_STYLE_GRADIENT
        self.btn1 = platebtn.PlateButton(self, wx.ID_ANY, label=" File ", style=droparrow)
        self.btn1.SetPressColor(wx.LIGHT_GREY) 
        self.menu1 = wx.Menu()
        self.menu1.Append(1, "New")
        self.menu1.Append(2, "Open")
        self.menu1.Append(3, "Exit")
        sm = wx.Menu()
        sm.Append(8, "sub item 1")
        sm.Append(9, "sub item 1")
        self.menu1.AppendMenu(7, "Test Submenu", sm)
        self.btn1.SetMenu(self.menu1)
        self.Bind(wx.EVT_BUTTON, self.OnFile, self.btn1)
    def OnFile(self, event):
        self.btn1.PopupMenu(self.menu1, pos=(1, self.btn1.GetSize()[1]))
app = wx.App(False)
frame = MyFrame(None, -1, "PopupMenu example")
frame.Show()
app.MainLoop()
2

可以试试用 wx.PostEvent 来实现:

event = wx.MenuEvent(wx.wxEVT_LEFT_DOWN, menuitem.GetId(), menu)
wx.PostEvent(frame, event)

其他的 wx 鼠标事件可以查看这里: http://www.wxpython.org/docs/api/wx.MouseEvent-class.html

这个信息是在 谷歌讨论组找到的。

撰写回答