2012-05-30 50 views
0

我把我的問題歸結爲這篇文章中顯示的示例代碼。請注意,我沒有調用app.MainLoop(),因爲這不是一個交互式窗口;我希望它在開始時彈出,在工作發生時顯示一些進度條,並在完成時消失。wxPython - 如何強制UI刷新?

我對wxPython和wx.Yield()的理解讓我相信,在某些UI工作之後調用wx.Yield()會將這些更改刷新到顯示。這不會發生 - 當我運行這個腳本時,在「Hello World」應該是灰色的框。

我在做什麼錯?

import wx 

class MyFrame(wx.Frame): 
    def __init__(self, parent, id): 
     wx.Frame.__init__(self, parent, id, size=(400,400)) 
     self.panel = wx.Panel(self, -1) 
     wx.StaticText(self.panel, -1, "Hello World", (20,20)) 
     wx.Yield() 


class MyApp(wx.App): 
    def OnInit(self): 
     self.frame = MyFrame(None, -1) 
     self.frame.Show(True) 
     self.SetTopWindow(self.frame) 
     return True 


def run(): 
    app = MyApp(redirect=False) 
    import time; time.sleep(5) 

run() 

回答

0

代替wx.Yield()

只需調用self.Update()

+0

我剛試過,得到了與上述相同的結果。 – Doug

+1

嗯猜你的權利...我不知道你可能不得不添加一個MainLoop,你可以只顯示模式,然後onclose或任何殺死wx.App ...不知道真的 –

2

你需要是易彎曲或更新定期,這樣當你的OS /窗口管理器發送重新繪製消息到您的應用程序,它可以處理它們。我對wxPython並不是100%確定的,因爲我最近沒有使用它,但我不認爲如果沒有主循環來適當地處理這些消息,你就可以做你想做的事情。

您可能會發現(爲什麼主循環是重要的,以及解釋)講講但是線程的主循環,這裏很有用:http://wiki.wxpython.org/MainLoopAsThread

0

不是說它會在原來的海報上做任何好事,但wx.Yield()本來可以完成這項工作。它只需要在正確的位置,如同self.Show()
以下輸出一個進度條,它會被更新。

import wx 
import time 
class MyFrame(wx.Frame): 
    def __init__(self, parent, id): 
     wx.Frame.__init__(self, parent, id, size=(290,200)) 
     self.panel = wx.Panel(self, -1) 
     wx.StaticText(self.panel, -1, "Hello World", (20,20)) 
     self.gauge = wx.Gauge(self.panel, -1, 50, pos=(20,50), size=(250, 20)) 
     self.Show() 
     n = 0 
     while n < 50: 
      n = n+1 
      self.gauge.SetValue(n) 
      wx.Yield() 
      time.sleep(1) 

class MyApp(wx.App): 
    def OnInit(self): 
     self.frame = MyFrame(None, -1) 
     self.SetTopWindow(self.frame) 
     return True 

def run(): 
    app = MyApp() 

run()