2009-12-02 7 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)의 OnPaint에서

  2. 그리기는하지만, OnPaint를

    에서 BufferedPaintDC의 필요
  3. 직접 그리기도 없다 그래서 당신은 시작 InitBuffer을 초기화하는

  4. 크기가 올바른지 또는 매우 적은 수 없습니다 곳 제거 wx.MemoryDC

  5. 당신은 창에 그리는대로 다룰 것입니다 창에서 패널을 만드는를 사용하여 버퍼하기 당신은 크기 조정에서 그렇게 나 크기가 너무 원 여기

가있다 깜박임을 방지하기 위해 크기 조절도

  • 무시 EVT_ERASE_BACKGROUND에 윈도우의 중앙에 정확하게 그려 를 변경 한 경우의 OnPaint에 전화를 확인해야합니다 업데이트 된 코드

    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

    1

    wxPython 데모는 이와 같은 것들을위한 훌륭한 리소스입니다. 예를 들어 Miscellaneous -> DrawXXXList에서 데모를 확인하십시오. 이것은 창에 타원 전체를 그리는 방법을 보여줍니다.

    +0

    감사합니다. 예. 데모를 확인하겠습니다! – Madhura

    관련 문제