我正在尝试在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()
我在做什么错?!
干杯, 卷曲
答案 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
,导致RecursionError
。 after
的正确语法是root.after(<delay>, <function to execute>)
,因此,在这里将上面的行替换为
root.after(50, lambda: check_thread(thread))
解决问题。