【问题标题】:wxPython - How to force UI refresh?wxPython - 如何强制 UI 刷新?
【发布时间】:2012-05-30 22:25:23
【问题描述】:

我已将我的问题归结为本文中显示的示例代码。请注意,我没有调用 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()

【问题讨论】:

    标签: python user-interface wxpython


    【解决方案1】:

    您需要定期生成或更新,以便当您的操作系统/窗口管理器向您的应用发送重绘消息时,它可以处理它们。我不是 100% 确定 wxPython,因为我最近没有使用它,但我认为如果没有主循环来适当地处理消息,你就无法做你想做的事。

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

    【讨论】:

      【解决方案2】:

      而不是 wx.Yield()

      只需调用 self.Update()

      【讨论】:

      • 嗯,你猜对了......我不知道你可能需要添加一个 MainLoop 并且你可以只显示模态然后 onclose 或任何杀死 wx.App ......不确定
      【解决方案3】:

      没有MainLoop 不会触发任何事件,.Refresh 也将不起作用。

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

      【讨论】:

        【解决方案4】:

        并不是说它对原始海报有任何好处,但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()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-12-15
          • 1970-01-01
          • 1970-01-01
          • 2019-09-22
          • 2010-11-16
          • 2015-11-25
          • 2011-01-13
          相关资源
          最近更新 更多