wxPython ScrolledPanel调用方法后控件不显示问题求助
wxPython ScrolledPanel调用滚动方法后控件消失问题
问题现象
- 父Panel包含两个子Panel,底部为ScrolledPanel
- 调用
panel.SetScrollRate(10, 10)时,底部Panel内所有控件消失;注释该行后控件正常显示,顶部Panel始终无异常 - 在InspectionTool中执行
obj.SetupScrolling(rate_x=10, rate_y=10, scrollToTop=False)可正常运行,但将该行写入代码后,控件仍会消失
问题原因
ScrolledPanel需要明确知道内部内容的尺寸才能正确渲染滚动区域和控件。当前代码中,添加完所有控件到sizer后直接调用滚动相关方法,此时sizer尚未完成尺寸计算,导致ScrolledPanel无法正确定位控件位置,最终表现为控件消失。
解决方案
在调用SetScrollRate或SetupScrolling之前,先让sizer完成尺寸计算,可通过以下方式实现:
修改_panel_bot方法,添加尺寸计算步骤:
def _panel_bot(self, kwargs): panel = ScrolledPanel(self) sizer = wx.BoxSizer(wx.VERTICAL) panel.SetSizer(sizer) grid_sizer = wx.GridBagSizer(vgap=2, hgap=2) sizer.Add(grid_sizer, 0, wx.CENTER | wx.ALL, 6) w_fg_color_0 = kwargs['w_fg_color_0'] w_fg_color_1 = kwargs['w_fg_color_1'] widget_labels = kwargs['widget_labels'] for idx, label in enumerate(widget_labels): label = label.replace(r'\n', '\n') widget = wx.StaticText(panel, wx.ID_ANY, label) if label.endswith(':'): span = 1 weight = 10 color = w_fg_color_0 else: span = 2 weight = 12 color = w_fg_color_1 if '\n' in label: width = 46 else: width = 23 widget.SetFont(wx.Font( weight, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, 0, '')) widget.SetForegroundColour(wx.Colour(*color)) widget.SetMinSize((-1, width)) grid_sizer.Add( widget, (idx, 0), (1, span), wx.ALIGN_CENTER_VERTICAL | wx.LEFT | wx.RIGHT | wx.BOTTOM, 6) # 先让sizer计算内容尺寸 sizer.Fit(panel) # 再设置滚动速率 panel.SetScrollRate(10, 10) # 或使用SetupScrolling # panel.SetupScrolling(rate_x=10, rate_y=10, scrollToTop=False) kwargs['panel'] = panel return panel
额外优化建议
在_create_widgets方法中添加新面板后,强制更新父布局,确保整体显示正常:
def _create_widgets(self, kwargs): g_sizer = kwargs['g_sizer'] panel = kwargs.get('panel') # 销毁旧面板 self._destroy_panel(panel, g_sizer) # 创建新面板 panel = self._panel_bot(kwargs) g_sizer.Add(panel, 0, wx.EXPAND | wx.ALL, 6) # 更新父布局 g_sizer.Layout() self.Layout()
内容的提问来源于stack exchange,提问作者cnobile
相关产品推荐
相关产品推荐

