代码之家  ›  专栏  ›  技术社区  ›  Ram Rachum

wxpython:在现有wx.panel上覆盖wx.panel的好方法

  •  5
  • Ram Rachum  · 技术社区  · 15 年前

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

    实现这一目标的好方法是什么?我研究过wx.notebook,但还没有找到一种方法让它不显示标签。

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

    1 回复  |  直到 12 年前
        1
  •  11
  •   Anurag Uniyal    13 年前

    有几种方法

    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()