Wxpython 我想给画的画一个事件

Wxpython 我想给画的画一个事件,wxpython,Wxpython,我想为我画的画举办一个活动 现在,我用wxPython绘制矩形 我想连接像按钮一样的链接 可能吗 如果可能的话,请给我一些建议 下面是我的代码 import wx class Example(wx.Frame): def __init__(self, parent, title): super(Example, self).__init__(parent, title=title, size=(350, 280)) self.

我想为我画的画举办一个活动

现在,我用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() 导入wx 类示例(wx.Frame): 定义初始(自我、父母、头衔): super(例如,self)。\uuuuu init\uuuuuuu(父级,title=title, 大小=(350280)) self.Bind(wx.EVT_-PAINT,self.OnPaint) 自我中心() self.Show() def OnPaint(自我,e): dc=wx.ClientDC(自) 直流立根刷(wx刷(“黄色”)) self.original=dc.DrawRectangle(10,15,90,60) 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': app=wx.app() 示例(无,“颜色”) app.MainLoop()
当您第一次看到这一点时,当按下按钮时,很容易调用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

注意:

您不希望在绘制事件中使用ClientDC!您可以使用PaintDC

当系统需要重新绘制窗口时,甚至会出现绘制。因此,您要做的是:

  • 在类中存储窗口的状态
  • 在绘制处理程序中,构造一个PaintDC,并使用对象的状态绘制希望窗口的外观
  • 如果希望由于系统绘制事件以外的其他事件而更新窗口的外观,请调用: self.Refresh() self.Update()
这将触发绘制事件

(您也可以使用ClientDC和draw,但最好使用Update()——这样系统可以更好地计时绘图)

关于在Wiki herre上绘图有很多内容:

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