在WxPython中隐藏菜单栏

问题描述 投票:0回答:1

我正在尝试找到一种方法,当鼠标不在菜单栏上时隐藏菜单栏,我知道我可以获取鼠标的xy位置,并检查它是否在某个区域内,但是我没有运气来隐藏菜单栏本身。我的代码:


class HelloFrame(wx.Frame):
    images = []

    def __init__(self, *args, **kw):
        # ensure the parent's __init__ is called
        super(HelloFrame, self).__init__(*args, **kw)

        # create a panel in the frame
        pnl = wx.Panel(self)

        # create a menu bar
        self.makeMenuBar()

        # and a status bar
        #self.CreateStatusBar()
        #self.SetStatusText("Welcome to wxPython!")


    def makeMenuBar(self):

        fileMenu = wx.Menu()
        helloItem = fileMenu.Append(-1, "&Load Backround Image")
        fileMenu.AppendSeparator()
        exitItem = fileMenu.Append(wx.ID_EXIT)
        helpMenu = wx.Menu()
        aboutItem = helpMenu.Append(wx.ID_ABOUT)
        menuBar = wx.MenuBar()
        menuBar.Append(fileMenu, "&File")
        #menuBar.Append(OptionsMenu, "&Options") TBM
        menuBar.Append(helpMenu, "&Help")

        # Give the menu bar to the frame
        self.SetMenuBar(menuBar)

        # Finally, associate a handler function with the EVT_MENU event for
        # each of the menu items. That means that when that menu item is
        # activated then the associated handler function will be called.
        self.Bind(wx.EVT_MENU, self.OpenImage, helloItem)
        self.Bind(wx.EVT_MENU, self.OnExit,  exitItem)
        self.Bind(wx.EVT_MENU, self.OnAbout, aboutItem)



    def OnExit(self, event):
                self.Close(True)

    def OnAbout(self, event):
        wx.MessageBox("Test",
                      "About",
                      wx.OK|wx.ICON_INFORMATION)

    def OpenImage(self, event):
        with wx.FileDialog (None, "Choose image", wildcard="PNG files (*.png)|*.png", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) as fileDialog:
            if fileDialog.ShowModal() == wx.ID_CANCEL:
                return       # the user changed their mind
            else:
                # Gets rid of other images
                for i in self.images:
                    i.Destroy()
                    self.images.remove(i)

                # Displays image and adds image object to [self.images]
                ImageName = fileDialog.GetPath()
                png = wx.Image(ImageName, wx.BITMAP_TYPE_ANY).ConvertToBitmap()
                self.images.append(wx.StaticBitmap(self, -1, png, (0, 0), (png.GetWidth(), png.GetHeight())))
                print(ImageName)


if __name__ == '__main__':
    app = wx.App()
    frm = HelloFrame(None, title='FileHeader Test')
    frm.Show()
    app.MainLoop()

我尝试只是在makemakeubar函数中添加menubar.Hide(),但无济于事香港专业教育学院也尝试过self.Hide()在同一地区,但没有运气

python wxpython
1个回答
0
投票

我首先要说的是,我不建议您这样做。这是非标准的,可能会造成混淆。在没有明显好处的情况下,这是昂贵的cpu。

也就是说,这是使用ShowHideEVT_MOTION的一种方法。问题在于,一旦将其隐藏/删除,下一个鼠标OVER就不会发生,因为它不再存在。如您所料,我们可以分配一个我们所希望的地区范围。如果光标进入该区域,则可以显示或隐藏菜单。

import wx

class HelloFrame(wx.Frame):
    images = []

    def __init__(self, *args, **kw):
        # ensure the parent's __init__ is called
        super(HelloFrame, self).__init__(*args, **kw)
        # create a panel in the frame
        pnl = wx.Panel(self)
        pnl2 = wx.Panel(self)
        pnl.SetBackgroundColour("green")
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(pnl,1, wx.EXPAND,10)
        sizer.Add(pnl2,1, wx.EXPAND,10)
        self.SetSizer(sizer)

        # create a menu bar
        self.makeMenuBar()

        # and a status bar
        #self.CreateStatusBar()
        #self.SetStatusText("Welcome to wxPython!")
        pnl.Bind(wx.EVT_MOTION, self.MenuPos)


    def makeMenuBar(self):

        fileMenu = wx.Menu()
        helloItem = fileMenu.Append(-1, "&Load Backround Image")
        fileMenu.AppendSeparator()
        exitItem = fileMenu.Append(wx.ID_EXIT)
        helpMenu = wx.Menu()
        aboutItem = helpMenu.Append(wx.ID_ABOUT)
        self.menuBar = wx.MenuBar()
        self.menuBar.Append(fileMenu, "&File")
        self.menuBar.Append(helpMenu, "&Help")

        # Give the menu bar to the frame
        self.SetMenuBar(self.menuBar)
        self.menuBar.Hide()
        # Finally, associate a handler function with the EVT_MENU event for
        # each of the menu items. That means that when that menu item is
        # activated then the associated handler function will be called.
        self.Bind(wx.EVT_MENU, self.OpenImage, helloItem)
        self.Bind(wx.EVT_MENU, self.OnExit,  exitItem)
        self.Bind(wx.EVT_MENU, self.OnAbout, aboutItem)

    def MenuPos(self, event):
        x, y = event.GetPosition()
        if y <= 2:
            self.menuBar.Show()
        if y >= 3:
            self.menuBar.Hide()
        event.Skip()

    def OnExit(self, event):
                self.Close(True)

    def OnAbout(self, event):
        wx.MessageBox("Test",
                      "About",
                      wx.OK|wx.ICON_INFORMATION)

    def OpenImage(self, event):
        with wx.FileDialog (None, "Choose image", wildcard="PNG files (*.png)|*.png", style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) as fileDialog:
            if fileDialog.ShowModal() == wx.ID_CANCEL:
                return       # the user changed their mind
            else:
                # Gets rid of other images
                for i in self.images:
                    i.Destroy()
                    self.images.remove(i)

                # Displays image and adds image object to [self.images]
                ImageName = fileDialog.GetPath()
                png = wx.Image(ImageName, wx.BITMAP_TYPE_ANY).ConvertToBitmap()
                self.images.append(wx.StaticBitmap(self, -1, png, (0, 0), (png.GetWidth(), png.GetHeight())))
                print(ImageName)


if __name__ == '__main__':
    app = wx.App()
    frm = HelloFrame(None, title='FileHeader Test')
    frm.Show()
    app.MainLoop()

enter image description here enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.