新面板仅在 window 调整大小时激活:WxPython

New panel activating only when window resized: WxPython

我想删除一个面板 ( mainPanel ) 并替换一个面板 ( secPanel )。我试过的代码:

import wx

class secPanel ( wx.Panel ):
    def __init__ ( self, parent ):
        wx.Panel.__init__ ( self, parent = parent )
        wx.TextCtrl ( self, pos = ( 100, 100 ) )

class mainPanel ( wx.Panel ):
    def __init__ ( self, parent ):
        wx.Panel.__init__ ( self, parent = parent )
        self.parent = parent
        b = wx.Button ( self, label = "Test", pos = ( 100, 100 ) )
        self.Bind ( wx.EVT_BUTTON, self.onPress, b )

    def onPress ( self, event ):
        parent = self.parent
        self.Destroy()
        secPanel ( parent )
        
class Window ( wx.Frame ):
    def __init__ ( self ):
        wx.Frame.__init__ ( self, parent = None, title = "" )

        mainPanel ( self )
        self.Show()

if __name__ == "__main__":
    app = wx.App()
    window = Window()
    app.MainLoop()

mainPanel 被删除,但 secPanel 仅在 window 调整大小时显示(即使只有一个像素也有效)。在我调整大小之前,它会显示一个灰色屏幕(没有任何面板会显示的屏幕)。这很烦人。

在这种情况下 Layout() 是你的朋友。
通常 Layout() 在涉及 sizer 时使用,但在这种情况下,没有 sizer 但 parentwx.TopLevelWindow.

Layout 使用 window sizer 布置子项或调整 window 的唯一子项的大小以覆盖其整个区域。

wx.TopLevelWindow.Layout 覆盖基础 class 布局方法以检查此 window 是否恰好包含一个子项 - 通常情况下,wx.Panel 通常被创建为wx.TopLevelWindow 的唯一子节点 – 并且,如果是这种情况,调整此子节点的大小 window 以覆盖整个客户区。

见下文parent.Layout()

import wx

class secPanel ( wx.Panel ):
    def __init__ ( self, parent ):
        wx.Panel.__init__ ( self, parent = parent )
        wx.TextCtrl ( self, pos = ( 100, 100 ) )

class mainPanel ( wx.Panel ):
    def __init__ ( self, parent ):
        wx.Panel.__init__ ( self, parent = parent )
        self.parent = parent
        b = wx.Button ( self, label = "Test", pos = ( 100, 100 ) )
        self.Bind ( wx.EVT_BUTTON, self.onPress, b )

    def onPress ( self, event ):
        parent = self.parent
        self.Destroy()
        secPanel ( parent )
        parent.Layout()

class Window ( wx.Frame ):
    def __init__ ( self ):
        wx.Frame.__init__ ( self, parent = None, title = "" )

        mainPanel ( self )
        self.Show()

if __name__ == "__main__":
    app = wx.App()
    window = Window()
    app.MainLoop()