wxPython - 如何强制UI刷新?

时间:2012-05-30 22:25:24

标签: python user-interface wxpython

我已将问题归结为此帖中显示的示例代码。请注意,我没有调用app.MainLoop(),因为这不是一个交互式窗口;我希望它在开始时弹出,在工作发生时显示一些进度条,并在完成时消失。

我对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()

4 个答案:

答案 0 :(得分:3)

您需要定期让步或更新,以便当您的操作系统/窗口管理器向您的应用发送重新显示消息时,它可以处理它们。我对wxPython并不是100%肯定,因为我最近没有使用它,但我不认为你可以做你想要的,没有主循环来适当地处理消息。

你可能会在这里找到一些关于线程主循环的有用的东西(但是解释为什么主循环很重要):http://wiki.wxpython.org/MainLoopAsThread

答案 1 :(得分:0)

而不是wx.Yield()

只需调用self.Update()

即可

答案 2 :(得分:0)

如果没有MainLoop,则不会触发任何事件,.Refresh也无效。

我猜wxSplashscreen可能就是你要找的东西。示例:http://wiki.wxpython.org/SplashScreen

答案 3 :(得分: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()