如何正确获取wxPython面板(Panel)的实际显示尺寸
问题原因
你在app.MainLoop()启动前调用frame.GetPanelSize(),此时Frame的Sizer布局计算、窗口最大化渲染都还未执行,拿到的是Panel初始化时的默认尺寸(20, 20)。wx.lib.inspection能拿到正确尺寸,是因为它查询属性的时机是主循环运行、窗口完成渲染之后。
解决方案
你可以按需选择以下任意一种方式获取正确尺寸:
方式1:强制触发布局计算(适合初始化完成后一次性获取)
在Frame初始化的self.Show()后增加布局和刷新调用,强制系统完成尺寸计算:
# 放在DrawFrame.__init__的最后 self.Maximize() self.Show() self.Layout() self.Update()
此时再调用GetPanelSize()就能拿到正确的实际尺寸。
方式2:绑定显示事件获取首次渲染后的尺寸(更稳妥)
绑定wx.EVT_SHOW事件,在窗口第一次完成显示后自动获取尺寸,避免手动调用时机错误:
# DrawFrame.__init__中添加事件绑定 self.Bind(wx.EVT_SHOW, self.OnFirstShow) # 新增DrawFrame方法 def OnFirstShow(self, event): event.Skip() print("DrawPanel实际尺寸:", self.GetPanelSize()) # 只触发一次,后续不需要重复执行就解绑 self.Unbind(wx.EVT_SHOW, handler=self.OnFirstShow)
方式3:绑定尺寸变化事件实时获取最新尺寸(适合自适应绘图场景)
如果你的DrawPanel需要随窗口大小调整自动适配绘图内容,绑定wx.EVT_SIZE事件实时更新尺寸:
# DrawPanel.__init__中添加事件绑定 self.Bind(wx.EVT_SIZE, self.OnPanelSizeChange) # 新增DrawPanel方法 def OnPanelSizeChange(self, event): event.Skip() # 实时保存最新尺寸 self.panel_width, self.panel_height = self.GetSize() # 触发重绘,适配新尺寸 self.Refresh() # 对应修改OnPaint方法,直接使用保存的实时尺寸绘图 def OnPaint(self, event=None): dc = wx.PaintDC(self) dc.Clear() dc.SetPen(wx.Pen(wx.BLACK, 2)) dc.SetBrush(wx.Brush('WHITE')) # 用当前Panel实际尺寸绘制,不需要依赖全局屏幕分辨率 dc.DrawRectangle(5, 0, self.panel_width - 10, self.panel_height) dc.DrawLine(40, 100, 600, 100)
内容的提问来源于stack exchange,提问作者gdtraveller
相关产品推荐
相关产品推荐

