tqdm.std.TqdmKeyError: "Unknown argument(s): {'widget': <PyQt6.QtWidgets.QTextEdit object at 0x0000026F39DC9240>}"
时间: 2024-10-23 12:16:13 浏览: 64
当你遇到`tqdm.std.TqdmKeyError: "Unknown argument(s): {'widget': ...}"`这样的错误,通常是因为你在调用`tqdm`函数时传递了一个它不认识的参数。在这个上下文中,`widget` 参数是你试图设置为文本编辑框(QTextEdit)的,但在`tqdm`的标准配置中,可能并不支持直接将Qt控件作为其内部进度条的输出。
`tqdm`的`widget`选项通常是用来连接到控制台或其他已经存在的进度条实例,比如`rich.progress`这样的第三方进度条。对于Qt GUI应用,你可以尝试使用`tqdm_gui`模块提供的`tqdm_notebook`,它是为了Jupyter Notebook设计的,能够更好地集成到Qt应用中。
如果想要在Qt应用中显示进度,一种可能的做法是使用`tqdm_gui`的`tqdm_gui`类,或者创建一个自定义的回调函数,当`tqdm`更新时手动更新文本框的内容,而不是直接传入Qt对象。
例如,你可以创建一个简单的线程来处理下载任务,而在主线程中同步更新文本框:
```python
from PyQt5.QtCore import QThread
from tqdm.auto import tqdm
# 使用tqdm_gui替代
from tqdm_gui import tqdm as gui_tqdm
def download_and_update_progress(url, filename):
with gui_tqdm(total=int(requests.head(url).headers.get('content-length', 0))) as progress:
# 使用QThread和信号槽来在主线程更新文本框
class DownloadThread(QThread):
update_progress_signal = pyqtSignal(int) # 创建一个信号
def run(self):
response = requests.get(url, stream=True)
if response.status_code == 200:
with open(filename, 'wb') as f:
for chunk in response.iter_content(chunk_size=8192):
if chunk:
f.write(chunk)
self.update_progress_signal.emit(len(chunk)) # 发送数据到主线程
thread = DownloadThread()
thread.update_progress_signal.connect(self.update_textbox) # 连接信号到槽
thread.start()
# 更新文本框的方法
def update_textbox(progress_value):
self.textbox.moveCursor(QTextCursor.End)
self.textbox.insertPlainText(f"Downloaded {progress_value} bytes")
# 然后在主程序中创建和启动下载线程
download_and_update_progress(url, filename)
```
这样,`tqdm`的进度值就会通过信号传递给主线程,并显示在指定的文本框中。
阅读全文