使用wxpython绘制圆

使用wxpython绘制圆,wxpython,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 = SketchW

嗨,我正在用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()
谢谢

多个问题

  • 您未绑定到EVT_油漆,例如。 self.Bind(wx.EVT_-PAINT,self.OnPaint)

  • 在OnPaint中绘制,但如果您希望先绘制然后重用该位图,则OnPaint中不需要BufferedPaintDC

  • 使用wx.MemoryDC直接绘制到缓冲区

  • 您正在窗口中创建一个面板,该面板将覆盖您在窗口中绘制的任何内容,所以请删除该面板

  • 您正在开始初始化InitBuffer,其大小可能不正确或非常小 您应该在resize中执行此操作,或者调用onPaint并检查大小是否已更改 所以,在调整大小时,圆也正确地画在窗口的中心

  • 覆盖EVT_擦除_背景以避免闪烁

  • 下面是更新后的代码

    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()
    

    wxPython演示是一个很好的资源。例如,在Miscellaneous->DrawXXXList下查看演示。这一个演示了如何在窗口中绘制一大堆椭圆。

    谢谢,是的,我将查看演示!