2015-08-28 54 views
1

我正在使用wxpython来做一些图像处理工作。我想用鼠标左键画出一个点,并用鼠标移动来移动绘制的点。wxpython用鼠标移动绘制点

以下是我的代码。当左键点击时画点没问题,但是当我移动鼠标时,先前绘制的点也显示出不符合我的期望的点。

如何隐藏前一点当我移动鼠标,使它看起来像我移动点?

# -*- coding: utf-8 -*- 

import wx 

class MyFrame(wx.Frame): 
    isLeftDown = False 

    def __init__(self, parent): 
     wx.Frame.__init__(self, parent, id=wx.ID_ANY, size=wx.Size(500, 500)) 
     bSizer1 = wx.BoxSizer(wx.VERTICAL) 

     self.m_panel = wx.Panel(self, wx.ID_ANY, wx.DefaultPosition, 
           wx.DefaultSize, wx.TAB_TRAVERSAL) 
     bSizer1.Add(self.m_panel, 3, wx.EXPAND | wx.ALL, 5) 

     bmp = wx.EmptyBitmap(500, 500) 
     self.staticBMP = wx.StaticBitmap(self.m_panel, wx.ID_ANY, bmp) 

     self.SetSizer(bSizer1) 

     # bind event 
     self.staticBMP.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) 
     self.staticBMP.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) 
     self.staticBMP.Bind(wx.EVT_MOTION, self.OnMove) 

    def OnLeftDown(self, event): 
     pos = event.GetPositionTuple() 
     dc = wx.ClientDC(self.staticBMP) 
     dc.DrawCircle(pos[0], pos[1], 5) 
     self.isLeftDown = True 

    def OnLeftUp(self, event): 
     self.isLeftDown = False 

    def OnMove(self, event): 
     if self.isLeftDown: 
      pos = event.GetPositionTuple() 
      dc = wx.ClientDC(self.staticBMP) 
      dc.DrawCircle(pos[0], pos[1], 3) 


if __name__ == '__main__': 
    app = wx.App() 
    frame = MyFrame(None) 
    frame.Show(True) 
    app.MainLoop() 

回答

0

您不想绘制新的圆,而是通过更新参数列表来移动现有的圆。

import wx 

WHITE_COLOR = (255,255,255) 

class MoveCircle(): 

    def __init__(self, parent): 
     self.parent=parent 
     self.parameters = [36,36,30] 
     self.advance=3 
     self.parent.Bind(wx.EVT_PAINT, self.on_paint) 
     self.timer = wx.Timer(self.parent) 
     self.parent.Bind(wx.EVT_TIMER, self.on_timer, self.timer) 
     self.timer.Start(100) 

    def on_paint(self, event=None): 
     dc = wx.PaintDC(self.parent) 
     dc.SetBrush(wx.Brush("blue")) 
     dc.DrawCircle(*self.parameters) 

    def on_timer(self, event): 
     self.parameters[0] += self.advance 
     print self.parameters 
     if self.parameters[0] < 36 or self.parameters[0] > 210: 
      self.advance *= -1 
     self.parent.Refresh() 


if __name__ == "__main__": 
    app = wx.App() 
    title = "Circle" 
    frame = wx.Frame(None, wx.ID_ANY, title, size=(250, 200)) 
    MoveCircle(frame) 
    frame.Show(True) 
    app.MainLoop() 
+0

谢谢你的回答。是的,我想要移动现有的点。您的答案是使用计时器事件并在框架上绘图。当我使用鼠标移动事件并在StaticBitmap上绘图时,可以吗? – tidy

+0

为了上天的缘故。这是一个例子! –

0

我已经用脏方法达到了这个效果。但我不知道它是不是财产法。如果这是错误的方式,请告诉我,我会更新或删除此答案。这里是我的代码:

# -*- coding: utf-8 -*- 

import wx 

class MyFrame(wx.Frame): 
    isLeftDown = False 

    def __init__(self, parent): 
     wx.Frame.__init__(self, parent, id=wx.ID_ANY, size=wx.Size(500, 500)) 
     bSizer1 = wx.BoxSizer(wx.VERTICAL) 

     self.m_panel = wx.Panel(self, wx.ID_ANY) 
     bSizer1.Add(self.m_panel, 3, wx.EXPAND | wx.ALL, 5) 

     self.bmp = wx.EmptyBitmap(500, 500) 
     self.staticBMP = wx.StaticBitmap(self.m_panel, wx.ID_ANY, self.bmp) 

     self.SetSizer(bSizer1) 

     # bind event 
     self.staticBMP.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) 
     self.staticBMP.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) 
     self.staticBMP.Bind(wx.EVT_MOTION, self.OnMove) 

    def OnLeftDown(self, event): 
     pos = event.GetPositionTuple() 
     dc = wx.ClientDC(self.staticBMP) 
     dc.DrawCircle(pos[0], pos[1], 5) 
     self.isLeftDown = True 

    def OnLeftUp(self, event): 
     self.isLeftDown = False 

    def OnMove(self, event): 
     if self.isLeftDown: 
      pos = event.GetPositionTuple() 
      dc = wx.ClientDC(self.staticBMP) 
      dc.DrawBitmap(self.bmp, 0, 0) 
      dc.DrawCircle(pos[0], pos[1], 5) 


if __name__ == '__main__': 
    app = wx.App() 
    frame = MyFrame(None) 
    frame.Show(True) 
    app.MainLoop()