使用python、pyqt6写一个界面,有两个按键和两个进度条,两个按键操作内容不同,都有耗时,要求每个按键都能独自更新进度条,不卡界面
时间: 2024-01-16 22:05:12 浏览: 225
好的,这是一个比较典型的多线程应用场景。我们可以使用 PyQt6 提供的 QThread 类来实现多线程操作,同时使用 PyQt6 提供的信号与槽机制来更新界面的进度条。下面是一个简单的实现:
```python
import sys
import time
from PyQt6 import QtWidgets, QtGui, QtCore
class MyThread(QtCore.QThread):
progress_updated = QtCore.pyqtSignal(int)
def __init__(self, task_func, *args, **kwargs):
super().__init__()
self.task_func = task_func
self.args = args
self.kwargs = kwargs
def run(self):
self.task_func(*self.args, **self.kwargs)
def update_progress(self, value):
self.progress_updated.emit(value)
class MyWindow(QtWidgets.QWidget):
def __init__(self):
super().__init__()
# 创建 UI 控件
self.btn1 = QtWidgets.QPushButton('Button 1', self)
self.btn2 = QtWidgets.QPushButton('Button 2', self)
self.pbar1 = QtWidgets.QProgressBar(self)
self.pbar2 = QtWidgets.QProgressBar(self)
# 设置控件位置和大小
self.btn1.setGeometry(10, 10, 100, 30)
self.btn2.setGeometry(120, 10, 100, 30)
self.pbar1.setGeometry(10, 50, 100, 20)
self.pbar2.setGeometry(120, 50, 100, 20)
# 绑定按键事件
self.btn1.clicked.connect(self.on_btn1_clicked)
self.btn2.clicked.connect(self.on_btn2_clicked)
# 创建两个线程
self.thread1 = MyThread(self.do_task1)
self.thread2 = MyThread(self.do_task2)
# 绑定线程的信号与槽
self.thread1.progress_updated.connect(self.pbar1.setValue)
self.thread2.progress_updated.connect(self.pbar2.setValue)
def do_task1(self):
for i in range(101):
time.sleep(0.05)
self.thread1.update_progress(i)
def do_task2(self):
for i in range(101):
time.sleep(0.03)
self.thread2.update_progress(i)
def on_btn1_clicked(self):
self.thread1.start()
def on_btn2_clicked(self):
self.thread2.start()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
win = MyWindow()
win.setGeometry(100, 100, 240, 80)
win.show()
sys.exit(app.exec())
```
在这个代码中,我们创建了一个 MyThread 类来表示一个可以执行的线程任务,在这个类中我们重载了 run() 方法来实现任务的具体逻辑,同时定义了一个 update_progress() 方法用来更新进度条,并发出 progress_updated 信号。在 MyWindow 类中,我们创建了两个 MyThread 实例来分别处理两个不同的任务,并将它们的 progress_updated 信号绑定到进度条的 setValue() 槽上。在按钮点击事件中,我们只需要调用对应的线程实例的 start() 方法即可启动任务,并在任务执行完成后线程自动退出。整个过程中,界面不会卡顿,因为任务在独立的线程中执行。
阅读全文