python:wxPython 在现有 wx.Panel 上覆盖 wx.Panel 的好方法

更新时间:2024-04-14 下载TXT文档 下载Word文档

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

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

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

有几种方法

短码网-DuanMa.NET

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\
"*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,并且都有按钮切换到另一个面板,它们也随父框架调整大小,这意味着它拥有所有你需要。但正如我所说,有几种方法可以做到这一点。

更新了 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\
"*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()
  • 大声笑,我问这个问题已经十多年了??希望其他人会发现您的代码有帮助

以上就是短码网小编为大家整理的《 python:wxPython 在现有 wx.Panel 上覆盖 wx.Panel 的好方法》相关内容,希望大家喜欢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若内容造成侵权/违法违规/事实不符,请将联系本站反馈,一经查实,立即处理!

python:wxPython 在现有 wx.Panel 上覆盖 wx.Panel 的好方法》文档下载仅供参考学习,下载后请在24小时内删除。

转载注明出处:https://www.duanma.net/article/73989b92702.html

回到顶部