【问题标题】:wxPython: Good way to overlay a wx.Panel on an existing wx.PanelwxPython:在现有 wx.Panel 上覆盖 wx.Panel 的好方法
【发布时间】:2010-11-05 03:38:32
【问题描述】:

我有一个 wx.Frame,其中有一个主 wx.Panel,里面有几个小部件。我想要一个按钮来导致“帮助面板”出现。这个帮助面板可能是一个 wx.Panel,我希望它覆盖整个主 wx.Panel(不包括 wx.Frame 的菜单栏)。帮助按钮上应该有某种关闭按钮,可以让它再次消失。

什么是实现这一目标的好方法?我查看了 wx.Notebook,但没有找到让它不显示选项卡的方法。

请注意,我不想在用户每次关闭和打开帮助面板时都销毁并重新创建它:我只想隐藏它。

【问题讨论】:

    标签: python user-interface wxpython


    【解决方案1】:

    有几种方法

    a) 您可以创建一个自定义子面板,并使其在所有子小部件顶部的 0,0 处具有相同的大小和位置。无需销毁它只需显示/隐藏它 这也会随着父框架调整大小

    b) 弹出一个 wx.PopupWindow 或派生类并将其放置在正确的位置并调整大小

    如 a) 中所建议的,这里是一个示例,其中所有控件都使用 sizer 放置在面板中,因为创建了单独的帮助 cntrl,可以从按钮显示/隐藏,但您可以创建一个自定义的 cntrl 隐藏自己点击关闭

    import wx
    
    class MyFrame(wx.Frame):
        def __init__(self):
            wx.Frame.__init__(self, None)
    
            self.panel = wx.Panel(self)
    
            # create controls
            self.cntrlPanel = wx.Panel(self.panel)
            stc1 = wx.StaticText(self.cntrlPanel, label="wow it works")
            stc2 = wx.StaticText(self.cntrlPanel, label="yes it works")
            btn = wx.Button(self.cntrlPanel, label="help?")
            btn.Bind(wx.EVT_BUTTON, self._onShowHelp)
    
            sizer = wx.BoxSizer(wx.VERTICAL)
            sizer.Add(stc1)
            sizer.Add(stc2)
            sizer.Add(btn)
            self.cntrlPanel.SetSizer(sizer)
    
    
            # create help panel
            self.helpPanel = wx.Panel(self.panel)
            self.stcHelp = wx.StaticText(self.helpPanel, label="help help help\n"*8)
            btn = wx.Button(self.helpPanel, label="close[x]")
            btn.Bind(wx.EVT_BUTTON, self._onShowCntrls)
            sizer = wx.BoxSizer(wx.VERTICAL)
            sizer.Add(self.stcHelp)
            sizer.Add(btn)
            self.helpPanel.SetSizer(sizer)
            self.helpPanel.Hide()
            self.helpPanel.Raise()
            self.helpPanel.SetBackgroundColour((240,250,240))
            self.Bind(wx.EVT_SIZE, self._onSize)
    
            self._onShowCntrls(None)
    
        def _onShowHelp(self, event):
            self.helpPanel.SetPosition((0,0))
            self.helpPanel.Show()
            self.cntrlPanel.Hide()
    
        def _onShowCntrls(self, event):
            self.cntrlPanel.SetPosition((0,0))
            self.helpPanel.Hide()
            self.cntrlPanel.Show()
    
        def _onSize(self, event):
            event.Skip()
            self.helpPanel.SetSize(self.GetClientSizeTuple())
            self.cntrlPanel.SetSize(self.GetClientSizeTuple())
    
    app = wx.PySimpleApp()
    frame = MyFrame()
    frame.Show()
    app.SetTopWindow(frame)
    app.MainLoop()
    

    【讨论】:

    • 我想我可能错误地使用了“覆盖”这个词...我想要一个 wx.Panel 来覆盖主要的 wx.Panel,完全隐藏它。除了使用 wx.Panel 之外,我尝试做你所做的事情,但是如何让它始终根据 wx.Frame 的大小进行自我调整?
    • 初始设置面板 = 框架客户端的大小/或内部面板覆盖 OnSize(EVT_SIZE) 并根据框架大小调整帮助的大小
    • 好的,我已经更新了示例,现在有两个面板,一个用于 cntrl,一个用于帮助,内部都可以使用 sizers 排列 cntrls,并且都有按钮可以切换到其他面板,它们也可以调整大小父框架,这意味着它拥有你所需要的一切。但正如我所说,有几种方法可以做到这一点。
    【解决方案2】:

    更新了 Python 3.9.4 和 wxPython 4.1.1 的代码。希望人们觉得它有用。原来的帖子对我很有用,但作为一个新手,我花了一些力气让它与最近发布的工具一起正常运行。

    import wx
    
    class MyFrame(wx.Frame):
        def __init__(self):
            wx.Frame.__init__(self, None)
    
            self.panel = wx.Panel(self)
    
            # create controls
            self.cntrlPanel = wx.Panel(self.panel)
            stc1 = wx.StaticText(self.cntrlPanel, label="wow it works")
            stc2 = wx.StaticText(self.cntrlPanel, label="yes it works")
            btn = wx.Button(self.cntrlPanel, label="help?")
            btn.Bind(wx.EVT_BUTTON, self._onShowHelp)
    
            sizer = wx.BoxSizer(wx.VERTICAL)
            sizer.Add(stc1)
            sizer.Add(stc2)
            sizer.Add(btn)
            self.cntrlPanel.SetSizer(sizer)
    
            # create help panel
            self.helpPanel = wx.Panel(self.panel)
            self.stcHelp = wx.StaticText(self.helpPanel, label="help help help\n"*8)
            btn = wx.Button(self.helpPanel, label="close[x]")
            btn.Bind(wx.EVT_BUTTON, self._onShowCntrls)
    
            sizer = wx.BoxSizer(wx.VERTICAL)
            sizer.Add(self.stcHelp)
            sizer.Add(btn)
            self.helpPanel.SetSizer(sizer)
    
            self.helpPanel.Hide()
            self.helpPanel.Raise()
            self.helpPanel.SetBackgroundColour((240,250,240))
    
            self.Bind(wx.EVT_SIZE, self._onSize)
    
            self._onShowCntrls(None)
    
        def _onShowHelp(self, event):
            self.helpPanel.SetPosition((0,0))
            self.helpPanel.Show()
            self.cntrlPanel.Hide()
    
        def _onShowCntrls(self, event):
            self.cntrlPanel.SetPosition((0,0))
            self.helpPanel.Hide()
            self.cntrlPanel.Show()
    
        def _onSize(self, event):
            event.Skip()
            self.helpPanel.SetSize(self.GetClientSize())
            self.cntrlPanel.SetSize(self.GetClientSize())
    
    app = wx.App(False)
    frame = MyFrame()
    frame.Show()
    app.SetTopWindow(frame)
    app.MainLoop()
    

    【讨论】:

    • 大声笑,我问这个问题已经十多年了?希望其他人会觉得你的代码有帮助
    猜你喜欢
    • 2017-07-02
    • 1970-01-01
    • 2014-02-20
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    相关资源
    最近更新 更多