我有以下代码:
from PySide import QtCore, QtGui
import time
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(400, 133)
self.progressBar = QtGui.QProgressBar(Dialog)
self.progressBar.setGeometry(QtCore.QRect(20, 10, 361, 23))
self.progressBar.setProperty("value", 24)
self.progressBar.setObjectName("progressBar")
self.pushButton = QtGui.QPushButton(Dialog)
self.pushButton.setGeometry(QtCore.QRect(20, 40, 361, 61))
self.pushButton.setObjectName("pushButton")
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8))
self.pushButton.setText(QtGui.QApplication.translate("Dialog", "PushButton", None, QtGui.QApplication.UnicodeUTF8))
self.progressBar.setValue(0)
self.pushButton.clicked.connect(self.progress)
def progress(self):
self.progressBar.minimum = 1
self.progressBar.maximum = 100
for i in range(1, 101):
self.progressBar.setValue(i)
time.sleep(0.1)
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
Dialog = QtGui.QDialog()
ui = Ui_Dialog()
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
我希望进度条位于单独的线程中,因此它不会冻结应用程序,但是我似乎找不到解决方法。
谁能帮忙吗?
我认为您可能会误会。您需要在单独的线程中进行工作,以免冻结应用程序。但是您还希望能够更新进度条。您可以通过使用创建工作人员类来实现此目的QThread
。QThread能够发出信号,您的UI可以侦听并采取适当的行动。
首先,让我们创建您的worker类。
#Inherit from QThread
class Worker(QtCore.QThread):
#This is the signal that will be emitted during the processing.
#By including int as an argument, it lets the signal know to expect
#an integer argument when emitting.
updateProgress = QtCore.Signal(int)
#You can do any extra things in this init you need, but for this example
#nothing else needs to be done expect call the super's init
def __init__(self):
QtCore.QThread.__init__(self)
#A QThread is run by calling it's start() function, which calls this run()
#function in it's own "thread".
def run(self):
#Notice this is the same thing you were doing in your progress() function
for i in range(1, 101):
#Emit the signal so it can be received on the UI side.
self.updateProgress.emit(i)
time.sleep(0.1)
因此,既然您拥有一个工人阶级,就该利用它了。您将需要在您的Ui_Dialog
类中创建一个新函数来处理发出的信号。
def setProgress(self, progress):
self.progressBar.setValue(progress)
在那里,您可以删除progress()
功能。
在retranslateUi()
您将要更新按钮事件处理程序从
self.pushButton.clicked.connect(self.progress)
至
self.pushButton.clicked.connect(self.worker.start)
最后,在您的setupUI()
函数中,您将需要创建worker类的实例,并将其信号连接到setProgress()
函数。
在这之前:
self.retranslateUi(Dialog)
添加:
self.worker = Worker()
self.worker.updateProgress.connect(self.setProgress)
这是最终代码:
from PySide import QtCore, QtGui
import time
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(400, 133)
self.progressBar = QtGui.QProgressBar(Dialog)
self.progressBar.setGeometry(QtCore.QRect(20, 10, 361, 23))
self.progressBar.setProperty("value", 24)
self.progressBar.setObjectName("progressBar")
self.pushButton = QtGui.QPushButton(Dialog)
self.pushButton.setGeometry(QtCore.QRect(20, 40, 361, 61))
self.pushButton.setObjectName("pushButton")
self.worker = Worker()
self.worker.updateProgress.connect(self.setProgress)
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
self.progressBar.minimum = 1
self.progressBar.maximum = 100
def retranslateUi(self, Dialog):
Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8))
self.pushButton.setText(QtGui.QApplication.translate("Dialog", "PushButton", None, QtGui.QApplication.UnicodeUTF8))
self.progressBar.setValue(0)
self.pushButton.clicked.connect(self.worker.start)
def setProgress(self, progress):
self.progressBar.setValue(progress)
#Inherit from QThread
class Worker(QtCore.QThread):
#This is the signal that will be emitted during the processing.
#By including int as an argument, it lets the signal know to expect
#an integer argument when emitting.
updateProgress = QtCore.Signal(int)
#You can do any extra things in this init you need, but for this example
#nothing else needs to be done expect call the super's init
def __init__(self):
QtCore.QThread.__init__(self)
#A QThread is run by calling it's start() function, which calls this run()
#function in it's own "thread".
def run(self):
#Notice this is the same thing you were doing in your progress() function
for i in range(1, 101):
#Emit the signal so it can be received on the UI side.
self.updateProgress.emit(i)
time.sleep(0.1)
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
Dialog = QtGui.QDialog()
ui = Ui_Dialog()
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
QThreads具有一些内置信号,这些信号会自动发出。您可以在文档中看到它们以及有关QThreads的更多信息。
问题内容: 我正在尝试线程wx.ProgressDialog。我有一个进度线程课程 当我按下一个按钮时会被调用 当我运行thread1.start()时,我收到100此类警告,并且进度条不显示。 如何在wxPython中使用线程制作进度条? 问题答案: 所有wxPython小部件和操作都应在单个线程中。如果要让对话框由另一个线程控制,则必须使用计时器和队列从另一个线程向对话框发送消息。 我了解的另
问题内容: 我想为服务器端任务创建进度条(用php编写) 出于学习目的,示例和任务将非常简单。我将在客户端页面上有一个文本字段,读取a ,将其与ajax一起传递给php脚本,并使其计算所有数字的总和(简单的任务是花费大量时间,只是为了模拟一些服务器端工作) 在.html文件中,我将创建一个计时器,该计时器每秒钟会调用一次函数,以获取for循环所需的索引并更新进度条。 我的问题是: 是否可能在同一个
问题内容: 我有一个网站,该网站的表单使用PHP发送表单数据。有没有一种方法可以在页面上创建一个进度条,使它看起来像正在运行,所以人们单击按钮并发送PHP信息后,不必单击按钮多次。 谢谢。 问题答案: 进度栏:简单文本版本: 进度栏:基于PHP(语法):
问题内容: 我需要为我的php上传网站创建进度栏的帮助。我已经整理了上传和摘录部分,但我需要进度条的帮助。我不确定该怎么做。另外,上传文件的最大大小是多少? 的HTML 的PHP 问题答案: 您可以进行一些更改以适合需要,但是如果您需要进度条,则效果会很好。您可以添加更多事件监听器,并根据需要进行设置。希望这对您来说是一个很好的起点。
问题内容: 好的,我是AJAX的新手。IE知道请求的生命周期,因此使用了ActiveXObject这样的东西。 但是现在我面临一个现实世界的问题。我有一个在后台运行的servlet,它执行许多任务,并且我想显示一个进度条,以显示流程的执行位置,并还显示实际发生的事情。 到目前为止,在服务器端,我可以计算将要开始的进程数,并且可以轻松地添加一个计数器,以便在每个进程完成后递增-因此使我能够找到自己想
问题内容: 当使用AngularJS并使用新页面进行重定向时,加载会花费一些时间,尤其是在移动设备上。 有没有一种方法可以添加进度条进行加载?也许像YouTube这样的东西? 问题答案: 对于YouTube一样的进度条,您可以查看ngprogress。然后,例如,在配置好应用程序之后,您就可以拦截route的events。 并执行类似的操作: