【问题标题】:wxpython: adding panel to wx.Frame disables/conflicts with wx.Frame's OnPaint?wxpython:将面板添加到 wx.Frame 会禁用/与 wx.Frame 的 OnPaint 发生冲突?
【发布时间】:2011-07-06 21:45:46
【问题描述】:

刚刚遇到这个奇怪的情况:找了个例子,wx.Frame的OnPaint被覆盖,画了一个圆。有趣的是,只要我在框架中添加了一个面板,就不再绘制圆圈了 - 事实上,OnPaint 根本不再被称为 ! (顺便说一句,我在 Ubuntu Lucid 上试过这个例子)

如果这是预期的行为,谁能解释我,如果 wx.Frame 有子面板,如何正确处理 wx.Frame 的OnPaint?小代码示例如下..

提前感谢您的任何回答,
干杯!

代码:

#!/usr/bin/env python

# http://www.linuxquestions.org/questions/programming-9/wxwidgets-wxpython-drawing-problems-with-onpaint-event-703946/

import wx

class MainWindow(wx.Frame):
    def __init__(self, parent, title, size=wx.DefaultSize):
        wx.Frame.__init__(self, parent, wx.ID_ANY, title, wx.DefaultPosition, size)

        self.circles = list()
        self.displaceX = 30
        self.displaceY = 30

        circlePos = (self.displaceX, self.displaceY)
        self.circles.append(circlePos)

        ## uncommenting either only first, or both of 
        ## the commands below, causes OnPaint *not* to be called anymore! 
        #~ self.panel = wx.Panel(self, wx.ID_ANY)
        #~ self.mpanelA = wx.Panel(self.panel, -1, size=(200,50))

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

    def OnPaint(self, e):
        print "OnPaint called"
        dc = wx.PaintDC(self)
        dc.SetPen(wx.Pen(wx.BLUE))
        dc.SetBrush(wx.Brush(wx.BLUE))

        # Go through the list of circles to draw all of them
        for circle in self.circles:
            dc.DrawCircle(circle[0], circle[1], 10)


def main():
    app = wx.App()
    win = MainWindow(None, "Draw delayed circles", size=(620,460))
    win.Show()
    app.MainLoop()

if __name__ == "__main__":
    main()

【问题讨论】:

    标签: wxpython panel frame draw onpaint


    【解决方案1】:

    好的,我想这不是微不足道的......但我找到了线程“wxPython - drawing without paint event - Python answers”,其中提到了它:

    “wxPython in Action”中一个很好的策略是 以下:

    • 框架具有可绘制到 BufferedDC 中的 Draw 方法,该 BufferedDC 是 链接到位图成员,
    • 在paint方法中,位图成员被绘制到屏幕上

    ...然而,这实际上有点误导 - 如果我们查看其中一个示例,例如 Chapter-06/example1.py,很明显该应用程序产生了一个 wx.Frame(如我的示例);但是这里的wx.Frame 只是通过实例化wx.Window 来简单地初始化 - 它是 here 所有这些 DC onPaint 发生的地方。

    考虑到这一点,我上面的代码可以修改,所以它终于可以再次工作(即呈现蓝色圆圈),如下所示:

    #!/usr/bin/env python
    
    # http://www.linuxquestions.org/questions/programming-9/wxwidgets-wxpython-drawing-problems-with-onpaint-event-703946/
    
    import wx
    
    class MainWindowWindow(wx.Window):
        def __init__(self, parent):
            wx.Window.__init__(self, parent)
            self.Bind(wx.EVT_PAINT, self.OnPaint)
            self.circles = list()
            self.displaceX = 30
            self.displaceY = 30
    
            circlePos = (self.displaceX, self.displaceY)
            self.circles.append(circlePos)
    
            ## uncommenting either only first, or both of 
            ## the commands below, now calls onPaint
            ## (without these panels, OnPaint called once - with them, twice)
            self.panel = wx.Panel(self, wx.ID_ANY)
            self.mpanelA = wx.Panel(self.panel, -1, size=(200,50))
    
        def OnPaint(self, e):
            print "OnPaint called"
            dc = wx.PaintDC(self)
            dc.SetPen(wx.Pen(wx.BLUE))
            dc.SetBrush(wx.Brush(wx.BLUE))
    
            # Go through the list of circles to draw all of them
            for circle in self.circles:
                dc.DrawCircle(circle[0], circle[1], 10)
    
    
    class MainWindow(wx.Frame):
        def __init__(self, parent, title, size=wx.DefaultSize):
            wx.Frame.__init__(self, parent, wx.ID_ANY, title, wx.DefaultPosition, size)
            MainWindowWindow(self)
    
    
    def main():
        app = wx.App()
        win = MainWindow(None, "Draw delayed circles", size=(620,460))
        win.Show()
        app.MainLoop()
    
    if __name__ == "__main__":
        main()
    

    嗯,希望这对某人有所帮助,
    干杯!

    【讨论】:

      猜你喜欢
      • 2015-07-19
      • 2017-01-18
      • 1970-01-01
      • 2012-02-01
      • 1970-01-01
      • 2015-08-07
      • 1970-01-01
      • 2019-04-16
      • 1970-01-01
      相关资源
      最近更新 更多