PyQt5 未在另一个函数中将项目添加到列表小部件

问题描述 投票:0回答:1

我有以下简单的代码,并且由于某种原因

addItem()
没有在
exec_all()
函数中将项目添加到应用程序 UI 中的列表小部件中。
add_item()
在该功能之外工作得很好。我在下面添加了相关代码的最小片段:

from PyQt5 import QtWidgets, uic
from time import sleep

app = QtWidgets.QApplication([])
dlg = uic.loadUi("Program.ui")

def exec_all():
    dlg.OutputConsole.addItem("Test")
    web_scrap()
    # etc...

# web_scrap(): A function in another file that 
# scraps data from website. It needs to wait for
# HTML elements to fully load into DOM at times 
# by using sleep() from os module.
def web_scrap(dlg):
    sleep(5)

dlg.RunAllButton.clicked.connect(exec_all)

dlg.show()
app.exec()

更新:我通过更新上面的代码片段来重现问题发现了问题所在——似乎

addItem()
不想在稍后调用
sleep()
之前执行,这对我来说很奇怪,除非
addItem() 
是异步函数吗?为了解决这个问题,我是否必须使用
sleep()
web_scrap()
以外的其他方法来解决这个问题?

python qt pyqt pyqt5
1个回答
0
投票

事实证明,这确实是

sleep()
暂停了我的 pyqt 应用程序整个线程的执行。这也导致我的 pyqt 应用程序在单击按钮时挂起。请参阅下面的解决方案。

一般问题:在 python 程序中调用 time.sleep() 之前,某些任意数量的代码不会运行。

解决方案:使用

threading
python 模块为有问题的代码片段创建一个新线程。例如:

from PyQt5 import QtWidgets, uic
from time import sleep
from threading import *

app = QtWidgets.QApplication([])
dlg = uic.loadUi("Program.ui")

def problematic_code():
    # ...
    sleep(5)
    # ...

def new_thread():
    newThread = Thread(target=problematic_code)
    newThread.start()


dlg.ButtonInYourApp.clicked.connect(new_thread)

创建第二个线程将允许您的代码继续按预期运行,并防止您的 pyqt 应用程序因旋转轮而挂起。

© www.soinside.com 2019 - 2024. All rights reserved.