我如何在我的PyQt5应用程序中运行生成器循环而不停止它?

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

我的生成器代码

def search(query):
    dir_path = os.path.realpath("C:/")
    for root, dirs, files in os.walk(dir_path):
        for file in files:
            if query.lower() in str(file).lower():
                yield (root, file)
        for directory in dirs:
            if query.lower() in str(directory).lower():
                yield (root, directory)

我希望能够获取结果,显示结果并同时运行我的应用程序。

当我这样做时,它将挂起程序,直到循环结束,然后显示结果

def pushButtonFunc():
    text = self.LocalSearchBar.text()
    newWindow = QtWidgets.QDialog(ProjectOSP)
    newWindow.resize(1201, 861)
    listWidget = QtWidgets.QListWidget(newWindow)
    for root, file in search(text):
        ite = QtWidgets.QListWidgetItem(file)
        listWidget.addItem(ite)```
python python-3.x loops pyqt pyqt5
1个回答
1
投票

可能的解决方法:

  1. 天真,简单的方法是调用QApplication.processEvents()。这会在mainloop上循环一次,并且可以在同一线程中的任何位置调用。
  2. 另一个解决方案是以某种方式重构您的代码,例如在每个mainloop迭代中仅执行单个迭代。即使您的大部分工作与GUI有关,这也可以正常工作。
  3. 第三种解决方案是将大部分工作分解为单独的QThread,然后将数据与Qt的信号和插槽一起发送到GUI线程。如果很少的工作与GUI更改有关,则此功能特别有用。

后两者中哪一个最好,很大程度上取决于您的应用,您的特定用例以及比此处方便链接更多的代码。只有您可以拨打电话。

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