2009-12-02 240 views
0

您好我正在绘制一个使用wxpython作为项目的圆形。请仔细查看代码并告诉我我在做什么错误,它甚至不会显示任何错误,但不会绘制圆圈。我只是得到一个空白的窗口。使用wxpython绘制圆形

import wx 

class SketchFrame(wx.Frame): 
    def __init__(self, parent): 

     wx.Frame.__init__(self, parent, -1, "Sketch Frame",size=(350,350)) 
     self.sketch = SketchWindow(self, -1) 


class SketchWindow(wx.Window): 

    def __init__ (self, parent,ID): 

     wx.Window.__init__(self, parent, ID) 

     self.panel =wx.Panel(self, size= (350,350)) 

     self.InitBuffer() 


    def InitBuffer(self): 

     size=self.GetClientSize() 
     self.Buffer=wx.EmptyBitmap(size.width,size.height) 
     dc=wx.BufferedDC(None,self.Buffer) 
     dc.SetBackground(wx.Brush(self.GetBackgroundColour())) 
     dc.Clear() 
     self.Drawcircle(dc) 
     self.reInitBuffer=False 


    def Drawcircle(self,dc): 
     pen=wx.Pen('blue',4) 
     dc.SetPen(pen) 
     dc.DrawCircle(100,100,50) 

    def OnPaint(self, event): 
     dc = wx.BufferedPaintDC(self, self.buffer) 



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

感谢

回答

6

多个问题

  1. 你是不是结合EVT_PAINT例如 self.Bind(wx.EVT_PAINT,self.OnPaint)

  2. 绘制的OnPaint,但如果你想画,然后再重复使用位图,存在的OnPaint

    无需BufferedPaintDC的
  3. 直接绘制使用wx.MemoryDC

  4. 您正在创建窗口,这将覆盖任何你在窗口中绘制一个面板,以便去除

  5. 您在启动初始化InitBuffer其中大小可能不正确或非常少的缓冲 ,你应该做的是,在调整或在OnPaint中调用,并检查是否大小已经改变 所以圈在窗口的中心绘制正确的大小调整太

  6. 覆盖EVT_ERASE_BACKGROUND避免闪烁

这里是更新代码

import wx 

class SketchFrame(wx.Frame): 
    def __init__(self, parent): 

     wx.Frame.__init__(self, parent, -1, "Sketch Frame",size=(350,350)) 
     self.sketch = SketchWindow(self, -1) 

class SketchWindow(wx.Window): 

    def __init__ (self, parent,ID): 

     wx.Window.__init__(self, parent, ID) 
     self.Buffer = None 

     self.Bind(wx.EVT_PAINT, self.OnPaint) 
     self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBack) 

    def InitBuffer(self): 
     size=self.GetClientSize() 
     # if buffer exists and size hasn't changed do nothing 
     if self.Buffer is not None and self.Buffer.GetWidth() == size.width and self.Buffer.GetHeight() == size.height: 
      return False 

     self.Buffer=wx.EmptyBitmap(size.width,size.height) 
     dc=wx.MemoryDC() 
     dc.SelectObject(self.Buffer) 
     dc.SetBackground(wx.Brush(self.GetBackgroundColour())) 
     dc.Clear() 
     self.Drawcircle(dc) 
     dc.SelectObject(wx.NullBitmap) 
     return True 

    def Drawcircle(self,dc): 
     size=self.GetClientSize() 
     pen=wx.Pen('blue',4) 
     dc.SetPen(pen) 
     dc.DrawCircle(size.width/2,size.height/2,50) 

    def OnEraseBack(self, event): 
     pass # do nothing to avoid flicker 

    def OnPaint(self, event): 
     if self.InitBuffer(): 
      self.Refresh() # buffer changed paint in next event, this paint event may be old 
      return 

     dc = wx.PaintDC(self) 
     dc.DrawBitmap(self.Buffer, 0, 0) 
     self.Drawcircle(dc) 

if __name__=='__main__': 
    app=wx.PySimpleApp() 
    frame=SketchFrame(None) 
    frame.Show(True) 
    app.MainLoop() 
+0

谢谢,帮助。 – Madhura 2009-12-05 07:56:43

1

wxPython演示是一个很好的资源,用于这样的事情。例如,查看杂项 - > DrawXXXList下的演示。这个展示了如何在窗口中绘制一大堆椭圆。

+0

谢谢是的,我会检查演示! – Madhura 2009-12-05 07:56:10