0

好的,所以现在我几乎完成了我的小项目,还剩下一些东西,它正在运行我的后台任务,然后显示我的 GUI。

class myGUIApp:
    def __init()__: 
        ....
    def createwidgets():
        ....

if __name__ == "__main__":
    import myBackgroundTasks
    x = myBackgroundTasks()
    x.startbackground1()  <----- this is background task that doesn't need user interaction
    x.startbackground2() <----- this is background task that doesn't need user interaction
    MainWindow = myGUIApp()
    MainWindow.show() <---- this is Pyside GUI

问题是,在我的 2 个后台任务完成之前,GUI 不会“显示”,这可能需要相当长的时间,因为他们正在执行 I/O 作业和从互联网上抓取文件。我该怎么办?使用python的多线程(在后台任务中,我也在使用多线程)?线程?或多处理模块?还是其他人?谢谢回答。

4

1 回答 1

1

你可以把它放在一个thread. 由于 Qt gui 在其自己的线程中运行,因此使用起来很有效。使用 aqueue传回x. 唯一的窍门是您何时何地需要x?如果你在你的 gui 中需要它,那么最好的办法是使用 gui 的 after 方法,如果它有一个,或者任何它的等价物。关键是您不会占用所有资源,不断检查输出队列。如果你在你的 gui 中放置一个 while 循环,它可能会导致 gui 冻结。

from threading import Thread
from Queue import Queue

class myGUIApp:
    def __init()__: 
        ....
    def createwidgets():
        ....

if __name__ == "__main__":
    import myBackgroundTasks
    QUEUE = Queue()
    def queue_fun(q):
        x = myBackgroundTasks()
        x.startbackground1()  <----- this is background task that doesn't need user interaction
        x.startbackground2() <----- this is background task that doesn't need user interaction
        q.put(x)
    THREAD = Thread(target=queue_fun, args=QUEUE)
    THREAD.start()
    MainWindow = myGUIApp()
    MainWindow.show() <---- this is Pyside GUI

    # if you can wait until after mainloop terminates to get x, put this here
    while THREAD.is_alive()
        try:
            x = QUEUE.get_nowait()
        except Queue.Empty:
            continue
    # if you need this inside Pyside, then you should put this inside Pyside,
    # but don't use while loop, use Qt after function and call self.wait

    def wait(self):
        try:
            x = QUEUE.get_nowait()
        except Queue.Empty:
            self.after(5, self.wait)
于 2013-09-25T16:38:38.990 回答