在wxpython中缩放图片时出现问题
我需要在一个可以滚动的面板上绘制图像(也就是在图像上做标注)。但是我遇到了一些问题,因为当我放大或缩小时,它的表现不太正常。绘制会停止,然后过一会儿才会显示出来,而且位置也不对,常常是在窗口的左上角。而且绘制的线条也不正确。
下面是用于绘制的按钮(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
事件中进行绘图,而不是在移动鼠标时绘图。在鼠标移动时,你只需要刷新窗口,绘图的工作应该在绘画事件中处理。