Python使用threading下载视频报参数数量不匹配错误如何解决
错误产生原因
核心问题出在线程创建时的args参数传值错误:
threading.Thread的args参数要求传入元组类型的参数列表,你写的args=(url)中,单个元素加括号不会被Python识别为元组,只会被当做普通运算优先级括号,最终args实际拿到的是url字符串本身。- 线程启动时会把
args的内容迭代拆包传给目标函数,字符串被迭代后就是每个单独的字符,你的URL长度刚好是133,所以就给只接收1个参数的downloadVideo传了133个字符参数,触发类型错误。
另外还有一个潜在隐患:Tkinter控件不是线程安全的,你在子线程downloadVideo中直接修改update_label的属性,后续大概率会出现UI无响应、随机崩溃的问题。
修复方案
1. 修复线程参数传值错误
只需要给args的单个参数后面加逗号,强制Python识别为元组即可,修改线程封装函数代码:
def thread(url): update_label.configure(text='downloading..') # 末尾加逗号把args转为元组 thread = threading.Thread(target=downloadVideo, args=(url,)) thread.start()
2. 修复跨线程修改UI的潜在问题
把UI更新操作通过Tkinter的after方法调度到主线程执行,修改downloadVideo代码:
def downloadVideo(url): try: urllib.request.urlretrieve(url, 'last video you downloaded.mp4') # 调度到主线程10毫秒后执行更新 update_label.after(10, lambda: update_label.configure(text="download successfully!")) except: update_label.after(10, lambda: update_label.configure(text="download failed!"))
内容的提问来源于stack exchange,提问作者Yechiel babani
相关产品推荐
相关产品推荐

