不确定进度条不会在python tkinter中停止

时间:2019-08-13 14:46:36

标签: python tkinter

我正在尝试在python tkinter中获得一个进度条,以开始和停止下载过程。我试图为下载进度设置一个线程并启动进程栏。但是,该栏继续运行,并且出现“如果self._is_stopped是否self._started.is_set():RecursionError:超过最大递归深度”错误。

代码如下:

import time
import threading
import tkinter
from tkinter import ttk
from six.moves import urllib

def start_thread():
    b_start['state'] = 'disable'
    progbar.start()
    thread = threading.Thread(target=tasks)
    thread.start()
    root.after(50, check_thread(thread))

def check_thread(thread):
    if thread.is_alive():
        root.after(50, check_thread(thread))
    else:
        progbar.stop()
        b_start['state'] = 'normal'

def download_func():
    urllib.request.urlretrieve('ftp://ftp.ebi.ac.uk/pub/databases/uniprot/knowledgebase/uniprot_sprot_varsplic.fasta.gz', 'uni.dat')

def tasks():
    download_func()

root = tkinter.Tk()

progbar = ttk.Progressbar(root)
progbar.config(maximum=8,mode='indeterminate')
progbar.pack()

b_start = ttk.Button(root, text='Start',command=start_thread)
b_start.pack()

root.mainloop()

我在做什么错?!

干杯, 卷曲

1 个答案:

答案 0 :(得分:0)

问题出在函数上

def check_thread(thread):
    if thread.is_alive():
        root.after(50, check_thread(thread))
    else:
        progbar.stop()
        b_start['state'] = 'normal'

的确,

root.after(50, check_thread(thread))

立即重新执行check_thread,导致RecursionErrorafter的正确语法是root.after(<delay>, <function to execute>),因此,在这里将上面的行替换为

root.after(50, lambda: check_thread(thread))

解决问题。