如何使用PyQT同时更新GUI和发送网络请求

时间:2018-12-30 12:56:13

标签: multithreading python-requests click pyqt5 qpushbutton

Screenshoot

这些天我正在学习 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()

0 个答案:

没有答案