Tkinter冷冻多线程

时间:2014-10-20 15:05:47

标签: python multithreading tkinter

我需要一个基本上运行进度条几秒钟的应用程序,然后自行关闭。我使用this as an example同时首先针对Python 3.4进行调整,然后针对我自己的应用程序进行调整。但是,由于我构建代码的方式,它将首先运行线程及其完成的任务,然后才显示程序。这对我来说很成问题,在使用课程时我也没有看到解决方法。

from tkinter import ttk as ttk
from tkinter import *
import threading
import time



class App:
    def afterLoading(self):
        print('Loading finished')

    def process(self,master):
        time.sleep(2)
        print('Thread Done')
        self.afterLoading()

    def __init__(self, master):
        print()
        master.geometry("1270x800")
        master.resizable(0,0)


        t1 = threading.Thread(target=self.process, args=(master,))
        t1.start()
        self.loadingFrame(master)
        t1.join()

    def loadingFrame(self, master):

        frame = Frame(master, width=500, height=300)
        frame.pack(side=BOTTOM, pady=50)

        self.bar = ttk.Progressbar(frame, orient='horizontal', mode = 'indeterminate')
        self.bar.pack(fill=BOTH)
        self.bar.start(50)
        self.loadingLabel = Label(frame, text="Please wait whilst the programme initializes.")
        self.loadingLabel.pack()





root = Tk()
b = App(root)
root.mainloop()

1 个答案:

答案 0 :(得分:2)

嗯,使用您的示例代码,您只需删除对t1.join()的调用即可获得所需的行为。这样,您就可以在启动后台线程后立即启动Tk事件循环,这意味着当线程在后台运行时,您的GUI实际上可以启动。使用t1.join()调用阻止root.mainloop()执行,直到线程完成,这意味着您的GUI不会显示,直到线程完成为止。