Tkinter在多线程中冻结

0 投票
1 回答
763 浏览
提问于 2025-04-28 14:04

我需要一个应用程序,它基本上是运行一个进度条几秒钟,然后自己关闭。我参考了这个例子,先把它改成适合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 个回答

2

根据你的示例代码,你只需要去掉对 t1.join() 的调用,就能实现你想要的效果。这样一来,你可以在启动后台线程后立即开始 Tk 的事件循环,这样你的图形界面(GUI)就可以在后台线程运行的同时启动了。如果你使用 t1.join(),那么 root.mainloop() 就会等到线程完成后才会执行,这样你的图形界面就会等到线程完成后才会显示出来。

撰写回答