我使用PyQt5创建了一个包含进度条的UI。我已经在python中编码了这个进度条,以便它实时增加到99%。我面临的问题是,窗口不加载,直到工作完成。我读过类似的帖子,谈论线程,我不可能从中掌握任何东西。如果有人能向我解释一个解决方案,我将不胜感激,如果它确实需要线程,我还没有学习的一个方面,请用外行的术语向我解释。
import sys, os, sqlite3
import random, datetime
from PyQt5 import QtCore, QtGui, uic
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton,
QMessageBox, QProgressBar, QSplashScreen
import sqlite3
import time
window2 = uic.loadUiType("login_loadingbar.ui")[0]
class LoadingBar(QtWidgets.QMainWindow, window2):
def __init__(self, parent=None):
QtWidgets.QMainWindow.__init__(self, parent)
self.setupUi(self)
#title
self.setWindowTitle('Loading')
#makes progress bar go from 0-100, time scaled
def progress(self):
for i in range(100):
time.sleep(0.1)
self.login_progressBar.setValue(i)
app = QApplication(sys.argv)
w2 = LoadingBar(None)
w2.show()
w2.progress()
app.exec_()
当你创建gui应用程序时,你有一个线程,在这个线程中有一个叫做事件循环的东西-它本质上是处理事件的while true循环-在必要时重新绘制部件,将键盘和鼠标输入分派给相关部件。
因为你只有一个线程,你一次只能做一件事,所以当你做像time.sleep()
这样的长操作时,事件循环被冻结——没有小部件被重新绘制,没有输入被处理,直到它完成和事件循环的下一次迭代到达。
您可以创建第二个线程并将操作移动到那里,或者在简单的情况下,当操作可以分成几个部分时-在事件循环中处理事件在各个部分之间:
for i in range(100):
time.sleep(0.1)
self.login_progressBar.setValue(i)
QtWidgets.QApplication.processEvents()
这种方式事件循环有点工作,但应用程序不是100%响应,因为每个time.sleep(0.1)
冻结它,所以鼠标点击和其他事件可能无法处理。