wx.StaticLine不总是显示

1 投票
1 回答
865 浏览
提问于 2025-04-18 13:52

我在一个叫做 wx.GridBagSizer 的布局中放了一个 wx.StaticLine,用来分隔一些按钮。但是当窗口第一次打开的时候,这条线并没有显示出来。有时候在执行一个比较耗时的任务后(比如我移动窗口或者其他操作,可能是强制窗口重新绘制),这条线才会突然出现。
这就是它的表现:

窗口第一次打开时:

line not showing

经过一段长时间的任务(或者调整大小后):

line showing

我创建这条线的代码是:

self.m_staticline1 = wx.StaticLine( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL )
gbSizer101.Add( self.m_staticline1, wx.GBPosition( 2, 0 ), wx.GBSpan( 1, 2 ), wx.EXPAND |wx.ALL, 5 )

init 结束时,我用以下代码来绘制:

self.SetSizer( gbSizer1 )
self.Layout()
gbSizer1.Fit( self )

我不确定这是否重要,但这是我启动应用程序的方式:

app = wx.App(False)
frame = FWHM_Application(None)
frame.Show()
app.MainLoop()

有没有人知道为什么会出现这种情况,以及如何让它在一开始就显示出来?

编辑:这里有一个演示这个问题的示例程序:

import wx

class Test_Frame ( wx.Frame ):

    def __init__( self, parent ):

        wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = u"Test GUI", pos = wx.DefaultPosition, size = wx.Size( -1,-1 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )

        self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize )

        # Outer container
        gbSizer_outer = wx.GridBagSizer( 4, 3 )
        gbSizer_outer.SetFlexibleDirection( wx.BOTH )
        gbSizer_outer.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED )

        # Static box for analysis
        analyzeImageBox = wx.StaticBoxSizer( wx.StaticBox( self, wx.ID_ANY, u"Analyze Single Image" ), wx.VERTICAL )

        # Sizer for button/label layout within static box
        gbSizer_single = wx.GridBagSizer( 0, 0 )
        gbSizer_single.SetFlexibleDirection( wx.BOTH )
        gbSizer_single.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED )

        self.analyzeImage = wx.Button( self, wx.ID_ANY, u"Analyze Image", wx.DefaultPosition, wx.Size( 170,45 ), 0 )
        gbSizer_single.Add( self.analyzeImage, wx.GBPosition( 0, 0 ), wx.GBSpan( 1, 2 ), wx.ALL, 5 )

        self.m_staticline1 = wx.StaticLine( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL )
        gbSizer_single.Add( self.m_staticline1, wx.GBPosition( 1, 0 ), wx.GBSpan( 1, 2 ), wx.EXPAND |wx.ALL, 5 )

        self.plotX = wx.Button( self, wx.ID_ANY, u"Plot X", wx.DefaultPosition, wx.Size( 70,35 ), 0 )
        gbSizer_single.Add( self.plotX, wx.GBPosition( 2, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 )

        self.plotY = wx.Button( self, wx.ID_ANY, u"Plot Y", wx.DefaultPosition, wx.Size( 70,35 ), 0 )
        gbSizer_single.Add( self.plotY, wx.GBPosition( 2, 1 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 )


        analyzeImageBox.Add( gbSizer_single, 1, wx.EXPAND, 5 )

        gbSizer_outer.Add( analyzeImageBox, wx.GBPosition( 1, 1 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 )


        self.SetSizer( gbSizer_outer )
        gbSizer_outer.Fit( self )
        self.Layout()

        self.Centre( wx.BOTH )


app = wx.App(False)
frame = Test_Frame(None)
frame.Show()
app.MainLoop()

1 个回答

0
self.SetSizer(gbSizer1)
gbSizer1.Fit(self)
self.Layout()

试着把布局的调用放在最后。

撰写回答