使用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
相关产品推荐
相关产品推荐

