在wxpython中缩放图片时出现问题

1 投票
1 回答
1215 浏览
提问于 2025-04-15 17:53

我需要在一个可以滚动的面板上绘制图像(也就是在图像上做标注)。但是我遇到了一些问题,因为当我放大或缩小时,它的表现不太正常。绘制会停止,然后过一会儿才会显示出来,而且位置也不对,常常是在窗口的左上角。而且绘制的线条也不正确。

下面是用于绘制的按钮(onLeftDown)函数的代码。右键事件是放大。希望这样解释得够清楚。

你们有没有什么想法,知道发生了什么,以及我该怎么解决这个问题?
提前谢谢你们!

def OnLeftButtonEvent(self, event):
    self.curLine = []
    self.x, self.y = event.GetPositionTuple()
    self.CaptureMouse()

def OnMotion(self, event):
    if self.HasCapture() and event.Dragging():
      dc = wx.BufferedDC(None,self.buffer)
      dc.SetUserScale(self.scale,self.scale)
      # to zoom in and out ( increases whenever someone presses the right mouse button
      dc.BeginDrawing()
      dc.SetPen(wx.Pen(wx.BLUE, 3))
      coords = (self.x, self.y) + event.GetPositionTuple()
      self.curLine.append(coords)
      dc.DrawLine(*coords)
      self.x, self.y = event.GetPositionTuple()
      self.SetXY(event)
      dc.EndDrawing()

def OnRightDown(self,event):
    print self.scale
    self.scale=self.scale*2.0
    self.initDrawing()
    self.maxHeight=self.maxHeight*2
    self.maxWidth=self.maxWidth*2

1 个回答

3

你需要调整鼠标的坐标,以便它和绘图的缩放保持一致。比如,如果你设置了用户缩放比例为2,那么鼠标在x=10的位置,实际上会变成20。所以你需要这样做:

sx, sy = x/cur_scale, y/cur_scale

另外,你需要在EVT_PAINT事件中进行绘图,而不是在移动鼠标时绘图。在鼠标移动时,你只需要刷新窗口,绘图的工作应该在绘画事件中处理。

撰写回答