【问题标题】:I want to give an event to drawn picture我想给绘制的图片一个事件
【发布时间】:2014-04-14 21:33:08
【问题描述】:

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

目前,我用 wxPython 绘制矩形,

我想像按钮一样连接链接。

有可能吗?

如果可以的话请给我建议。

下面是我的代码。

导入 wx 类示例(wx.Frame): def __init__(self, parent, title): 超级(示例,自我).__init__(父,标题=标题, 大小=(350, 280)) self.Bind(wx.EVT_PAINT, self.OnPaint) 自我中心() 自我展示() def OnPaint(self, e): dc = wx.ClientDC(self) dc.SetBrush(wx.Brush("YELLOW")) self.original = dc.DrawRectangle(10, 15, 90, 60) 如果 __name__ == '__main__': 应用程序 = wx.App() 示例(无,“颜色”) app.MainLoop()

【问题讨论】:

    标签: wxpython


    【解决方案1】:

    当你第一次看到这个时,当你按下一个按钮时,你会很想调用你的 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()
    

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

    HTH

    【讨论】:

      【解决方案2】:

      注意:

      您不想在绘制事件中使用 ClientDC!您改用 PaintDC。

      每当系统需要重新绘制窗口时,甚至会发生绘制。所以你要做的是:

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

      这将触发绘制事件。

      (您也可以使用 ClientDC 并进行绘图,但最好使用 Update() -- 这样可以让系统更好地计时)

      这里有很多关于在 Wiki 上绘图的内容:

      http://wiki.wxpython.org/RecipesImagesAndGraphics

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-27
        • 2019-09-14
        • 1970-01-01
        • 2017-07-28
        • 2021-09-02
        • 1970-01-01
        • 2012-02-04
        • 2019-09-11
        相关资源
        最近更新 更多