我想给绘制的图片一个事件

时间:2014-03-11 10:25:49

标签: wxpython

我想给我绘制的图片一个事件。

目前,我用wxPython绘制矩形,

我希望像按钮一样连接链接。

有可能吗?

如果有可能请告诉我。

以下是我的代码。

import wx

class Example(wx.Frame):
    def __init__(self, parent, title):
        super(Example, self).__init__(parent, title=title, 
            size=(350, 280))

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

        self.Centre()
        self.Show()


    def OnPaint(self, e):
        dc = wx.ClientDC(self)

        dc.SetBrush(wx.Brush("YELLOW"))
        self.original = dc.DrawRectangle(10, 15, 90, 60)


if __name__ == '__main__':
    app = wx.App()
    Example(None, 'Colours')
    app.MainLoop()

2 个答案:

答案 0 :(得分:0)

当您第一次看到这个时,按下按钮时调用OnPaint方法会很诱人。但这不会按你想要的方式运作。

关于绘制内容的一个重点是,每次需要重新绘制屏幕时都需要调用OnPaint事件处理程序 - 显然。这意味着您需要在任何时候都可以使用绘制的逻辑,因此可以根据需要随时调用它。你不能在按下按钮时绘制一些东西,并期望它保持绘制 - 下一个绘画事件将擦除它。

这意味着你需要这样的逻辑:

import wx

class Example(wx.Frame):
    def __init__(self, parent, title):
        super(Example, self).__init__(parent, title=title, 
            size=(350, 280))

        self._showRectangle = False

        draw_button = wx.Button(self, label="Press Me")

        self.Bind(wx.EVT_BUTTON, self.OnButtonPressed, draw_button)

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

        self.Centre()
        self.Show()

    def OnButtonPressed(self, e):
        self._showRectangle = not(self._showRectangle)

    def OnPaint(self, e):
        # This must be called from EVT_PAINT, not EVT_BUTTON
        print "painting..."
        if self._showRectangle:
            dc = wx.ClientDC(self)

            dc.SetBrush(wx.Brush("YELLOW"))
            self.original = dc.DrawRectangle(10, 15, 90, 60)


app = wx.App()
Example(None, 'Colours')
app.MainLoop()

我在其中放置了一个print语句,以强调需要了解何时调用此处理程序。尝试最小化和最大化应用程序等...

HTH

答案 1 :(得分:0)

注意:

您不希望在绘图事件中使用ClientDC!您改为使用PaintDC。

只要系统需要重新绘制窗口,就会出现Paint。所以你想做的是:

  • 在您的班级中存储窗口的状态。
  • 在绘图处理程序中,构造一个PaintDC,并使用teh对象的状态来绘制窗口的样子。
  • 如果由于系统Paint事件之外的其他事件而希望更新Window的外观,请调用: self.Refresh() self.Update()

这将触发油漆事件。

(您也可以使用ClientDC并绘制,但它可以使用Update() - 这样可以让系统更好地计算绘图时间)

关于绘制Wiki的内容有很多:

http://wiki.wxpython.org/RecipesImagesAndGraphics

我还没有用按钮回答你关于衬里的问题,因为我不明白你想做什么。但是寻找鼠标事件 - 这可能是你想要的。