代码之家  ›  专栏  ›  技术社区  ›  Jordy Deweer

打开文件后如何将菜单项添加到wxpython 4中的菜单栏

  •  0
  • Jordy Deweer  · 技术社区  · 6 年前

    我有一个基本菜单栏,其代码如下:

    # Add menubar
    # Database menu
    self.menubar = wx.MenuBar()
    dbMenu = wx.Menu()
    newDbItem = wx.Menu()
    # New sub menu
    dbNewItem = newDbItem.Append(wx.ID_NEW, 'New database...')
    self.Bind(wx.EVT_MENU, self.newDbOnClick, dbNewItem)
    # If there database loaded, show other menu items in 
    # new submenu
    if self.dbPath != None:
        # New table submenu item
        tableNewItem = newDbItem.Append(wx.ID_NEW, 'New table...')
        self.Bind(wx.EVT_MENU, self.newTblOnClick, tableNewItem)
        # new row submenu item
        rowNewItem = newDbItem.Append(wx.ID_NEW, 'New row...')
        self.Bind(wx.EVT_MENU, self.newRowOnClick, rowNewItem)
        # New column submenu item
        columnNewItem = newDbItem.Append(wx.ID_NEW, 'New column...')
        self.Bind(wx.EVT_MENU, self.newColOnClick, columnNewItem)
    # Bind new submenu to db menu
    dbMenu.AppendMenu(wx.ID_NEW, 'New', newDbItem)
    # Open an already existing database file
    openDbItem = dbMenu.Append(wx.ID_OPEN, 'Open...')
    self.Bind(wx.EVT_MENU, self.openOnClick, openDbItem)
    # Make a copy of the currently opened database
    saveAsDbItem = dbMenu.Append(wx.ID_SAVEAS, 'Save as...')
    self.Bind(wx.EVT_MENU, self.saveDbAs, saveAsDbItem)
    # Exit the entire application
    quitDbItem = dbMenu.Append(wx.ID_EXIT, 'Quit')
    # Add the db menu to the menu bar
    self.menubar.Append(dbMenu, '&Database')
    

    实际上,当应用程序启动时,New Table、New Row和New Column选项不会显示在New子菜单中。但是,当我进入菜单并点击打开…选项并选择一个文件,这样dbpath变量就不再是空的,而是被填充的,应用程序也不会显示额外的菜单项。

    我开始浏览网页,发现了一些提示。其中之一是刷新应用程序,因此我的OpenOnClick事件处理程序如下所示:

    def openOnClick(self, e):
        dlg = wx.FileDialog(self, "Choose a database file", style=wx.FD_OPEN)
        if dlg.ShowModal() == wx.ID_OK:
            self.dbPath = dlg.GetPath()
            self.Update()
    

    不过,这根本不起作用。另一个解决方案是使用刷新方法,因此上一个示例的最后一行如下所示:

    self.Refresh()
    

    这没有给我任何改进…

    我真的没有收到错误信息。每次只会出现以下情况:

    programma.py:37:wxpydeprocitionwarning:调用已弃用的项。改为使用append。 dbmenu.appendmenu(wx.id_new,'new',newdbitem)

    有人能帮我找到正确的方法吗?或者能指出一个我看不到的错误吗?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Eduardo López    6 年前

    要从操作(按钮单击或菜单事件)添加菜单项,添加菜单项命令必须位于操作内部。

    请随意修改我的示例。

    import wx
    
    class AddMenu(wx.Frame):
    
        def __init__(self, *args, **kwargs):
            super(AddMenu, self).__init__(*args, **kwargs)
    
            self.InitUI()
    
        def InitUI(self):
    
            self.menubar = wx.MenuBar()  
    
            self.fileMenu = wx.Menu()
    
            pnl = wx.Panel(self)
    
            pnl.SetBackgroundColour(wx.Colour(10, 15, 68))
    
            vbox = wx.BoxSizer(wx.VERTICAL)
    
            quitItem = wx.MenuItem(self.fileMenu, wx.ID_EXIT, '&Quit\tCtrl+Q', 'Quit application')
            quitItem.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_QUIT))
            self.fileMenu.Append(quitItem) 
    
            addBtt = wx.Button(pnl, wx.ID_ANY, label='Add')
    
            vbox.Add(addBtt, flag=wx.EXPAND|wx.ALL, border=10)
    
    
            pnl.SetSizer(vbox)
    
    
            self.Bind(wx.EVT_MENU, self.OnQuit, quitItem)
            self.Bind(wx.EVT_BUTTON, self.OnAdd, addBtt)
    
            self.menubar.Append(self.fileMenu, '&File')
    
            self.SetMenuBar(self.menubar) 
    
            self.SetSize((250, 130))
            self.SetTitle('AddMenu')
            self.Centre()
    
            self.CreateStatusBar()
    
        def OnQuit(self, e):
            self.Close()
    
    
        def OnAdd(self, e):
            newItem2 = wx.MenuItem(self.fileMenu, wx.ID_NEW, '&NewNew\tCtrl+M')
            newItem2.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_NEW))
            self.fileMenu.Append(newItem2)
    
    
    
    if __name__ == '__main__':
        app = wx.App()
        ex = AddMenu(None)
        ex.Show()
        app.MainLoop()