【问题标题】:My wx.OnPaint() function is not called constantly in the wx main loop我的 ex.OnPaint() 函数不会在 wx 主循环中不断调用
【发布时间】:2019-11-02 15:24:14
【问题描述】:

我正在使用 OpenGL 和 wxPython 制作一个可导航的 3D 用户界面的项目。 但是,OnPaint() 函数似乎并没有在主循环中被连续调用。这使得我的界面不会不断更新。该函数仅在我在窗口周围拖动时调用。例如:当我按下箭头键时,窗口中的对象只有在我在窗口周围拖动时才会移动。

我将我的代码归结为这些代码行。谁能帮我在打印时不断调用OnPaint() 函数,而不需要在窗口周围拖动,就可以打印一堆“HI”?

if __name__ == "__main__":
    app = MyApp()
    app.MainLoop()
class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame()
        frame.Show()
        return True

class MyFrame(wx.Frame):
    def __init__(self):
        self.size = (1000, 700)
        wx.Frame.__init__(self, None, title ="wx", size=self.size)
        self.canvas = MyCanvas(self)
class MyCanvas(GLCanvas):

    def __init__(self, parent):
        GLCanvas.__init__(self, parent, -1, size=(1000, 700))
        self.Bind(wx.EVT_PAINT, self.OnPaint)

    def OnPaint(self, event):
        print("HI")

【问题讨论】:

    标签: python wxpython pyopengl


    【解决方案1】:

    wx.Windowwx.FrameGLCanvas 可以被 .Refresh() 强制重新绘制。
    例如您可以使用wx.IdleEvent 来触发画布不断刷新。

    class MyFrame(wx.Frame):
        def __init__(self):
            self.size = (1000, 700)
            wx.Frame.__init__(self, None, title ="wx", size=self.size)
            self.canvas = MyCanvas(self)
            self.Bind(wx.EVT_IDLE, self.OnIdle)
    
        def OnIdle(self, event):
            self.Refresh()         # refresh self and all its children
            #self.canvas.Refresh() # refresh self.canvas
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-20
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 2013-11-01
      • 1970-01-01
      • 2015-05-12
      • 2022-01-25
      相关资源
      最近更新 更多