You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 14:36:04