python - 如何防止 wx 面板与其他 sizer 重叠

标签 python python-3.x wxpython

基本上,我试图完成一个简单的隐藏面板,并在单击按钮时显示另一个面板,如果框架中有一个尺寸调整器,我通常可以做到这些,但在这种情况下,我有一个功能区,所以我有 2 个尺寸调整器每当我在 sizer 2 中显示面板时,它都会重叠并显示为好像它不属于 sizer。

我起草了一个基本的彩色示例来重现该问题,请注意,当您单击按钮时,蓝色面板会隐藏黄色面板,而不是替换灰色面板。

import wx


class MyForm(wx.Frame):

    #----------------------------------------------------------------------
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "HomeFinance", size = (1400,700))
        self.panel1 = RibbonPanel(self)
        self.panel2 = SidePanel(self)
        self.panel3 = MainPanel(self)
        self.panel4 = NewPanel(self)

        self.panel1.SetBackgroundColour(wx.Colour(191, 193, 65))
        self.panel2.SetBackgroundColour(wx.Colour(56, 122, 45))
        self.panel3.SetBackgroundColour(wx.Colour(77, 84, 96, 0))
        self.panel4.SetBackgroundColour(wx.Colour(55, 149, 153, 0))
        self.panel4.Hide()

        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.hsizer = wx.BoxSizer(wx.HORIZONTAL)

        self.sizer.Add(self.panel1, 1, wx.EXPAND)
        self.hsizer.Add(self.panel4, 1, wx.EXPAND)
        self.hsizer.Add(self.panel3, 1, wx.EXPAND)
        self.hsizer.Add(self.panel2, 1, wx.EXPAND)
        self.sizer.Add(self.hsizer, 1, wx.EXPAND)

        self.Bind(wx.EVT_BUTTON, self.onetimer, self.panel2.m_button1)
        self.SetSizer(self.sizer)
        self.CenterOnScreen()
        self.Show()

    def onetimer(self, event):
        self.panel3.Hide()
        self.panel4.Show()


class RibbonPanel(wx.Panel):
    def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.Size(1400, 115), style=wx.TAB_TRAVERSAL,
                 name=wx.EmptyString):
        wx.Panel.__init__(self, parent, id=id, pos=pos, size=size, style=style, name=name)
        self.Layout()

class MainPanel(wx.Panel):
    def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.Size(1000, 545), style=wx.TAB_TRAVERSAL,
                 name=wx.EmptyString):
        wx.Panel.__init__(self, parent, id=id, pos=pos, size=size, style=style, name=name)
        self.Layout()


class SidePanel(wx.Panel):
    def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.Size(400, 545), style=wx.TAB_TRAVERSAL,
                 name=wx.EmptyString):
        wx.Panel.__init__(self, parent, id=id, pos=pos, size=size, style=style, name=name)
        self.m_button1 = wx.Button(self, wx.ID_ANY, u"MyButton", wx.DefaultPosition, wx.DefaultSize, 0)
        self.Layout()


class NewPanel(wx.Panel):
    def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.Size(1000, 545), style=wx.TAB_TRAVERSAL,
                 name=wx.EmptyString):
        wx.Panel.__init__(self, parent, id=id, pos=pos, size=size, style=style, name=name)
        self.Layout()

# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm()
    frame.Show()
    app.MainLoop()

蓝色面板预计将取代灰色面板,并且具有完全相同的位置。

最佳答案

当您更改显示的小部件时,您需要 sizer 来计算新的位置和大小。因此,您的代码只是在 onetimer

中缺少对 self.Layout() 的调用

方法应该是:

def onetimer(self, event):
    self.panel3.Hide()
    self.panel4.Show()
    self.Layout()

关于python - 如何防止 wx 面板与其他 sizer 重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56292527/

相关文章:

Python 正则表达式 DUPLICATE_NAMES 标志

python - 比较两个文件的相似性,而不是常见问题

python - 使用 Python 3.5 安装 Seaborn 时出错

macos - 如何使用 wxpython 禁用 OSX 中的窗口关闭按钮?

python - 如何中断 python 中的阻塞方法?

python - 如何将值从一个列表转移到另一个列表?

python - Kivy TypeError 不支持的操作数类型

python - 带有 if 语句的 while 循环比 while 循环更快

linux - 网络感知 wx.FileDialog

python - wxPython:如何找出哪个小部件具有焦点?