проблема с масштабированием изображений в 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

person Moayyad Yaghi    schedule 11.01.2010    source источник
comment
Если исходный код, который вы разместили, является вашим фактическим кодом, у вас есть одна проблема — непоследовательное использование начальных пробелов. В OnRightDown self.initDrawing() использует отступ, отличный от предыдущей и следующей строки кода. Возможно, это ваша проблема?   -  person Bryan Oakley    schedule 11.01.2010
comment
нет проблема не в этом. нет ошибки отступа, но отступ здесь, на этой веб-странице, пропущен. не знаю, как исправить здесь.   -  person Moayyad Yaghi    schedule 11.01.2010
comment
self.HasCapture() and event.Dragging(): что означает эта строка?   -  person SilentGhost    schedule 11.01.2010


Ответы (1)


Вам нужно масштабировать координаты мыши так, чтобы они синхронизировались с масштабированием рисунка, поэтому, если вы используете userScale=2, мышь при x=10 будет равна 20 . так что вам нужно сделать это

sx, sy = x/cur_scale, y/cur_scale

Вам также нужно рисовать в событии EVT_PAINT, а не в движении, в движении вам просто нужно обновить окно, а событие рисования должно позаботиться о том, что вы хотите нарисовать.

person Anurag Uniyal    schedule 11.01.2010
comment
кстати, вам не нужно начинать/завершать рисование - они ничего не делают. (упс, это должно быть для Моайяда) - person Steven Sproat; 11.01.2010
comment
На самом деле, отрисовка в порядке (он копирует демонстрационный код wx) - EVT_PAINT просто переносит растровый буфер, который рисуется в событиях движения. Это код события рисования моей программы рисования: wx.BufferedPaintDC(self, self.buffer, wx.BUFFER_VIRTUAL_AREA) - person Steven Sproat; 11.01.2010
comment
но все же .. это не отвечает на мой вопрос, рисунок в порядке, но не при использовании dc.SetUserScale(). ты пробовал? или у кого-нибудь есть другой способ увеличить изображение - person Moayyad Yaghi; 11.01.2010