- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当使用 python pyqt 时,我制作了一个 Qprogressbar,并使用 Q 线程更新数字。下面显示的代码第一次运行成功,但是再次运行就会崩溃。
这是针对Python PyQt5,在Python 3.5系统中。我尝试将进度条重置为 0,但似乎不正确
这是我点击加载文件按钮后的调用函数,加载文件按钮和进度条位于QtWidgets.Qmainwindows中
loading_event_name = QtWidgets.QFileDialog.getOpenFileNames(self, 'CSV File', 'C:\\', '*.csv')
self.loading_progress_bar.reset()
self.loading_thread = QThread()
self.loading_worker = Load_Task_Thread()
self.loading_worker.moveToThread(self.loading_thread)
self.loading_thread.started.connect(self.loading_worker.run)
self.loading_thread.start()
self.loading_worker.Load_taskFinished.connect(self.Load_onFinished)
self.loading_worker.Loading_progressChanged.connect(self.loading_progress_bar.setValue, Qt.QueuedConnection)'''
第一个加载文件线程将完美工作,但是如果我想加载新文件,下次单击时,软件将崩溃,线程不会更新,进度条不会像第一次那样更新数字,并且自从我重置以来一直保持为零它。在 Debug模式下,我也无法向进度条发出任何数字:
class Load_Task_Thread(QThread):
Load_taskFinished = pyqtSignal()
Loading_progressChanged = pyqtSignal(int)
def run(self):
progress = 0
for file_name_num in range(len(loading_event[0])):
progress = 90 * file_name_num/len(loading_event_name[0])
self.Loading_progressChanged.emit(progress)
1+1.....
self.Loading_progressChanged.emit(100)
self.Load_taskFinished.emit()
我期望无论点击多少次选择新文件,进度条都能更新。或者有没有其他简单的方法可以显示进度条来显示加载过程。
最佳答案
您可能还有其他错误,但从您提供的代码中我观察到以下错误:
您已经创建了一个 QThread (Load_Task_Thread),并将其移动到另一个 QThread,这是不必要的,因为 Load_Task_Thread 是一个 QObject 就足够了。
没必要每次启动进程时都创建一个QThread,因为一个存在于线程中的QObject就足够了。
考虑到上述情况,我实现了以下示例:
from functools import partial
from PyQt5 import QtCore, QtGui, QtWidgets
class Load_Task_Worker(QtCore.QObject):
started = QtCore.pyqtSignal()
finished = QtCore.pyqtSignal()
progressChanged = QtCore.pyqtSignal(int)
@QtCore.pyqtSlot(list)
def run(self, filenames):
total = len(filenames)
self.started.emit()
self.progressChanged.emit(0)
for i, filename in enumerate(filenames, 1):
# start process
# ...
# end process
progress = 100 * i // total
self.progressChanged.emit(progress)
self.finished.emit()
class Widget(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.button = QtWidgets.QPushButton("Start Task")
self.loading_progress_bar = QtWidgets.QProgressBar()
lay = QtWidgets.QVBoxLayout(self)
lay.addWidget(self.button)
lay.addWidget(self.loading_progress_bar)
thread = QtCore.QThread(self)
thread.start()
self.worker = Load_Task_Worker()
self.worker.moveToThread(thread)
self.button.clicked.connect(self.onClicked)
self.worker.progressChanged.connect(self.loading_progress_bar.setValue)
self.worker.finished.connect(self.onFinished)
@QtCore.pyqtSlot()
def onFinished(self):
self.button.setEnabled(True)
@QtCore.pyqtSlot()
def onClicked(self):
filenames, _ = QtWidgets.QFileDialog.getOpenFileNames(
self, "CSV File", "C:\\", "*.csv"
)
if filenames:
self.button.setEnabled(False)
self.loading_progress_bar.reset()
wrapper = partial(self.worker.run, filenames)
QtCore.QTimer.singleShot(0, wrapper)
else:
print("not selected files")
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())
关于python - 如何通过响应式进度条重复使用 Qthread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58475606/
我想写一些必须在自己的线程中工作的类。我读过这篇文章:http://wiki.qt.io/Threads_Events_QObjects。它建议移动必须在自己的线程中工作的对象,例如: TestCla
在调用所有与 QThread::finished() 信号关联的槽后,QThread::wait() 是否返回(即解除阻塞执行)? 提前致谢。 最佳答案 不,它可能会在与信号 finished() 关
我不是在打电话 exec()在我的代码中,但 timer和 QUdpSocket工作正常。是 exec()用于等待 event接着说? 更新:timer正在工作,因为我没有调用 moveToThrea
如果我创建 QThread 作为局部变量,我发现了一个奇怪的行为。 例如,下面的代码将作为单线程工作,这意味着我需要等待 10 秒,结果才会出来。 但是如果我将线程从局部变量更改为成员变量,它将作为多
I solved my issue by moving the mySubQThread run() into the myQThread run() That said, I still would
一段时间以来,我一直在使用 Qt 开发一个应用程序,在该应用程序中我必须从相机中抓取帧。相机将在与应用程序其余部分不同的线程中运行。我遵循了以下建议: http://mayaposch.wordpre
考虑以下代码片段: class ThreadA::QThread { public: ThreadA() { } void run() { myVariable = n
所以我在构造函数中有以下代码。 m_someObject = new SomeObject(); m_someObject->moveToThread(&m_thread); m_thread.sta
我有 3 个 QThreads 相互调用(全部继承自 QThread。我知道有些人可能建议使用 moveToThread,但暂时忽略这个事实)。简化的代码如下所示: Thread1 类: void T
我想知道 new QThread(this) 和 new QThread() 之间有什么区别,以及这将如何影响我的代码在使用 QThread 时的行为. 最佳答案 QThread 的父级谁执行什么没有
我是 PySide2 的新手。我只是想启动一个示例应用程序并在应用程序启动时启动一个线程,并希望在应用程序关闭时停止该线程。当我关闭应用程序时,我收到以下错误:QThread:在线程仍在运行时销毁。s
关于如何实例化和使用 QThread 的官方文档可以在这里找到: http://doc.qt.io/qt-5/qthread.html 该文档描述了两种基本方法:(1) 工作对象方法和 (2) QTh
我有以下设置: int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // Create the DBM
这是 QTread 的子对象...并在主线程中将其具体化.... 运行时错误如下: ASSERT failure in QCoreApplication::sendEvent: "Cannot sen
在过去的几天里,我一直在尝试使用 QThreads 而不对 QThread 进行子类化的新的首选方法。我遇到的麻烦是当我试图关闭我创建的一组线程时。我经常收到“线程仍在运行时已被销毁”消息(如果我在
我已经创建了这个继承自QThread的类,用于向数据库服务器发送数据,你觉得怎么样?可以改进吗? 谢谢 #ifndef QUERYTHREAD_H#define QUERYTHREAD_H#inclu
我需要在一个线程中进行无限循环。 在 this article作者写道 >you should never ever block the event loop 因为它会阻塞信号槽概念。如何在 QTh
我试图在一个单独的线程中执行一些工作,并在工作完成后停止该线程。 我已经建立了这样的连接 thread.connect( workerClass, SIGNAL( finished() ), SLOT
我有一个快速的问题。我应该创建一个小的多线程程序来从多个传感器获取数据,并且我了解 pthreads 和 qthreads。我可以访问两个图书馆。我个人偏向于使用 Qt,因为它的设计和各种功能。但是,
我需要在主线程上运行 QThread::usleep() (出于各种原因)。 但是,usleep 是受静电保护的。 我想在没有包装器的情况下使用 QThread 的 usleep 函数(我目前正在使用
我是一名优秀的程序员,十分优秀!