1

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

4 回答 4

3

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

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

于 2012-05-31T17:24:00.503 回答
0

没有MainLoopno 事件将被触发,也.Refresh将无法工作。

我想wxSplashscreen可能是你正在寻找的。示例:http ://wiki.wxpython.org/SplashScreen

于 2012-06-09T21:17:18.767 回答
0

而不是 wx.Yield()

只需调用 self.Update()

于 2012-05-30T23:28:37.403 回答
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()
于 2016-07-17T16:01:04.850 回答