这些天我正在学习 PyQT5 。如您在上面的屏幕截图中所见,有一个黄色按钮,用于发送网络请求以验证用户名和密码,还显示由 QLabel 呈现的加载指示器。
我当前的问题是,当我单击登录按钮执行方法 login12306 时,处理了网络请求(带有 requests 模块),但是加载了gif不显示。该应用程序被冻结。如果我只希望它显示正在加载的图片,而不是在按下按钮时发送请求,则加载gif会很好地显示(就像图片一样)。 单击登录按钮后,似乎无法执行2个任务。
代码:
def showLoading(self):
# gifLabel is a QLabel
self.gifLabel.setGeometry(0, 0, 120, 120)
self.gifLabel.move(self.width() / 2 - self.gifLabel.width() / 2, self.height() / 2 - self.gifLabel.height() / 2)
self.gifLabel.setScaledContents(True)
self.gifLabel.setWindowFlags(Qt.FramelessWindowHint)
self.gifLabel.setAttribute(Qt.WA_TranslucentBackground)
movie = QMovie("Pictures/loading.gif")
movie.setCacheMode(QMovie.CacheAll)
self.gifLabel.setMovie(movie)
movie.start()
self.gifLabel.show()
def login12306(self):
self.showLoading()
self.login() # 5 steps requests in login method, one by one
是线程问题吗?以及如何解决?
如果您能提出建议或意见,将不胜感激。
我自己找到了解决方案:
class RequestRunnable(QRunnable):
def __init__(self,target):
super(RequestRunnable,self).__init__()
self.target =target
def run(self):
self.target()
def start(self):
QThreadPool.globalInstance().start(self)
然后在QDialog中定义一个函数:
def login12306(self):
self.showLoading()
self.pool = RequestRunnable(target=self.login)
self.pool.start()