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

使用wxPython开发时wx.Panel鼠标点击绘制坐标偏移异常求助

问题根因
  • 坐标体系不匹配:你给wx.Panel绑定了鼠标点击事件,e.GetPosition()拿到的是点击位置相对于Panel左上角的坐标
  • 绘制载体错误:paint方法中创建的wx.ClientDC绑定的是顶层Frame对象,Frame的坐标原点要算上系统标题栏、窗口边框、以及GridBagSizer给Panel设置的默认边距,直接用Panel的本地坐标在Frame上绘制就会出现固定偏移,和你观测到的坐标差完全对应。
修复方案

仅需修改paint方法的绘制载体为self.panel即可解决坐标偏移问题,同时补充了原代码缺失的窗口显示逻辑,修改后的完整代码如下:

import wx

class Test(wx.Frame):
    def __init__(self, parent, title):
        super(Test, self).__init__(parent, title = title, size = (820,900))
        
        self.startSelected = False
        self.radius = 10
        
        self.panel = wx.Panel(self, size=(800,800))
        self.panel.SetBackgroundColour(wx.Colour(0,0,200))
        
        self.panel.Bind(wx.EVT_LEFT_DOWN, self.onMouseDown)
        
        self.gbs = wx.GridBagSizer(0,0)   
        
        self.startBtn = wx.Button(self, wx.ID_ANY, label = 'Select Start')
        self.startBtn.Bind(wx.EVT_BUTTON, self.selectStart)
    
        self.gbs.Add(self.panel, span = (1,4), pos=(1,1),flag=wx.EXPAND | wx.ALL)
        self.gbs.Add(self.startBtn, pos=(2,1))

        self.SetSizer(self.gbs)
        self.Show() # 补充窗口显示逻辑,原代码运行不会弹出窗口
        
    def onMouseDown(self, e):
        pt = e.GetPosition()
        print pt.x, pt.y
        
        if e.LeftDown():
            if self.startSelected:
                color = wx.Colour(0,255,0)
                self.paint(pt, color)
            else:
                color = wx.Colour(255,255,255)
                self.paint(pt, color)                 
            
    def paint(self, pt, color):
        # 核心修改:将DC绑定到panel而非顶层Frame
        dc = wx.ClientDC(self.panel)
        b = wx.Brush(color)
        dc.SetBrush(b)
        dc.DrawCircle(pt.x, pt.y, self.radius)
        
    def selectStart(self, e):
        self.startSelected = True
        
            
if __name__ == '__main__':
    app = wx.App()
    Test(None, 'Test')
    app.MainLoop()

补充优化建议:当前使用wx.ClientDC绘制的内容会在窗口被遮挡、最小化、缩放后丢失,若要持久化显示,建议把所有绘制的圆点坐标存在列表中,绑定self.panel的EVT_PAINT事件,在事件回调中统一重绘所有圆点。

内容的提问来源于stack exchange,提问作者Byrd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:45:00