tkinter gui带进度条

j66*_*666 11 python tkinter

我有一个简单的TK gui和一个连接到按钮的函数中的长进程,当我点击按钮时我想要一个进度条.我想要一个进度条,我点击按钮,就像它开始一个很长很多的代码行

我怎样才能做到这一点?这里的代码:

from tkinter import Button, Tk, HORIZONTAL

from tkinter.ttk import Progressbar
import time


class MonApp(Tk):
    def __init__(self):
        super().__init__()


        bt1 = Button(self, text='Traitement', command=self.traitement)
        bt1.grid()
        self.progress = Progressbar(self, orient=HORIZONTAL,length=100,  mode='indeterminate')
        self.progress.grid()
        self.progress.grid_forget()


    def traitement(self):
        self.progress.grid()
        self.progress.start()
        time.sleep(15) 
        ## Just like you have many, many code lines...

        self.progress.stop()

if __name__ == '__main__':

    app = MonApp()
    app.mainloop()
Run Code Online (Sandbox Code Playgroud)

我尝试了很多东西,但我还没有找到怎么做.

如何在该应用中添加进度条?

xmc*_*mcp 17

你可以ttk.Progressbartkdocs找到

from tkinter import *
from tkinter.ttk import *

tk=Tk()
progress=Progressbar(tk,orient=HORIZONTAL,length=100,mode='determinate')

def bar():
    import time
    progress['value']=20
    tk.update_idletasks()
    time.sleep(1)
    progress['value']=50
    tk.update_idletasks()
    time.sleep(1)
    progress['value']=80
    tk.update_idletasks()
    time.sleep(1)
    progress['value']=100

progress.pack()
Button(tk,text='foo',command=bar).pack()
mainloop()
Run Code Online (Sandbox Code Playgroud)

最好threading在另一个线程中使用和运行代码.

像这样:

from tkinter import Button, Tk, HORIZONTAL

from tkinter.ttk import Progressbar
import time
import threading

class MonApp(Tk):
    def __init__(self):
        super().__init__()


        self.btn = Button(self, text='Traitement', command=self.traitement)
        self.btn.grid(row=0,column=0)
        self.progress = Progressbar(self, orient=HORIZONTAL,length=100,  mode='indeterminate')


    def traitement(self):
        def real_traitement():
            self.progress.grid(row=1,column=0)
            self.progress.start()
            time.sleep(5)
            self.progress.stop()
            self.progress.grid_forget()

            self.btn['state']='normal'

        self.btn['state']='disabled'
        threading.Thread(target=real_traitement).start()

if __name__ == '__main__':

    app = MonApp()
    app.mainloop()
Run Code Online (Sandbox Code Playgroud)

  • 你的代码几乎是正确的。只需使用 `threading` 库并在另一个线程中运行 `traitement`。看到我更新的答案。 (2认同)