使用wx.PaintDC持久绘制+临时覆盖

时间:2017-08-01 22:27:42

标签: python wxpython wxwidgets

我正在尝试使用wxPython创建一个Microsoft Paint-esque应用程序。

目前,在鼠标左下事件期间,应用程序使用圆形画笔“绘制”到屏幕上。这很棒,也很理想。但是我还需要一个相同半径的圆来“跟随”鼠标,而不是持久地绘制到wx.PaintDC上。

也就是说,鼠标在屏幕周围有一个半径的圆圈,但只有当按住鼠标左键时,圆圈才会“永久”地绘制在缓冲区上。

我采取的方法(1)在鼠标周围有一个圆圈,但不管鼠标向下都画在PaintDC实例上,(2)跟随鼠标但是永远不会画在PaintDC实例,或者(3)不要跟随鼠标,但是在左键下方显示并持续绘制(参见下面的示例)。

谢谢!

import wx

class MyPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, -1)

        self.draw = False
        self.radius = 50

        self.Bind(wx.EVT_PAINT, self.OnPaint)
        self.Bind(wx.EVT_MOTION, self.Draw)
        self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
        self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)

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

    def Draw(self, event):

        if self.draw == True:
            x = event.GetX()
            y = event.GetY()
            dc = wx.ClientDC(self)

            pen = wx.Pen(wx.Colour(192,192,192,128), 2)
            brush = wx.Brush(wx.Colour(192,192,192,128))

            dc.SetPen(pen)
            dc.SetBrush(brush)
            dc.DrawCircle(x,y,self.radius)

    def OnLeftDown(self, event):
        self.draw = True

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


class MyForm(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Test",style=wx.DEFAULT_FRAME_STYLE,size=wx.Size(400, 300))
        self.main_panel = MyPanel(self)

if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm()
    frame.Show()
    app.MainLoop()

1 个答案:

答案 0 :(得分:2)

wx.Overlay课做得很好,协助在更永久的东西上画临时的东西。请参阅演示中的叠加示例:https://github.com/wxWidgets/Phoenix/blob/master/demo/Overlay.py