Моя функция wx.OnPaint () не вызывается постоянно в главном цикле wx - PullRequest
1 голос
/ 19 июня 2019

Я работаю над проектом, используя OpenGL и wxPython, чтобы создать навигационный трехмерный пользовательский интерфейс. Однако, функция 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")

1 Ответ

2 голосов
/ 20 июня 2019

A wx.Window, как wx.Frame или GLCanvas, можно принудительно перекрасить с помощью .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
...