在Pyside2 for Python上显示应用程序后,如何刷新事件?

在Pyside2 for Python上显示应用程序后,如何刷新事件?,python,python-3.x,pyside2,Python,Python 3.x,Pyside2,我想用Pyside2 GUI创建一个python软件。我使用Qt Designer设计了GUI,并生成了一个.ui文件,加载到Python脚本中。 我正在寻找一种方法来放置一个“事件侦听器”,在显示应用程序有一个模块化类之后,我不想将我所有的connect()方法都放在类init中 我无法将我的类初始化和self.show()分开,因此我需要在.show()方法之后放置以下行: self.XMLButtonFolder=QPushButton(…) self.XMLButtonFolder.cl

我想用Pyside2 GUI创建一个python软件。我使用Qt Designer设计了GUI,并生成了一个.ui文件,加载到Python脚本中。 我正在寻找一种方法来放置一个“事件侦听器”,在显示应用程序有一个模块化类之后,我不想将我所有的connect()方法都放在类init中

我无法将我的类初始化和self.show()分开,因此我需要在.show()方法之后放置以下行:

self.XMLButtonFolder=QPushButton(…)
self.XMLButtonFolder.clicked.connect(self.method)
这是我的类init(是的,它是一个线程):

def\uuuu初始化(自):
self.app=QApplication([])
加载器=QUiLoader()
打印(“加载mainwindow.ui文件”)
self.window=loader.load(QFile(“mainwindow.ui”))
如果self.window不是None:
打印(“mainwindow.ui已加载”)
其他:
打印(“加载mainwindow.ui时出错”)
#XML
self.XMLButtonFolder=self.window.findChild(QPushButton,“XMLButtonFolder”)
self.XMLButtonFolder.clicked.connect(self.openBoxFolder_XML)
#报告
self.ReportButtonFolder=self.window.findChild(QPushButton,“ReportButtonFolder”)
self.ReportButtonFolder.clicked.connect(self.openBoxFolder\u报告)
#如果取消对以下行的注释,将正确调用eventListener()方法。。
#self.window.findChild(QPushButton,“XMLGenerateReport”)。单击。连接(self.eventListener)
self.window.show()
sys.exit(self.app.exec)
在同一个类中,我添加了一个函数来创建一个新连接,并从另一个按钮检测“单击”事件

def addEventListener(self、qtype、qname):
self.eventlistenerresult=False
self.\uu widget.findChild(self.elementtype[qtype],qname).单击.connect(self.eventListener)
这是主要的节目:

myapp=Application()
myapp.addEventListener(“按钮”、“XMLGenerateReport”)
问题是我没有刷新窗口的方法,因此事件不会被触发(run()方法中的设置有效,但之后的设置无效)

我希望能够触发名为“XMLGenerateReport”的按钮的事件,即使在.show()之后调用.connect()方法

我们怎么能做到呢

可复制的示例:(是的,我知道,在这个示例中,它只能在事件中出现,但对我来说没问题) main.py:

从窗口导入应用程序
导入线程
def GenerateDocument():
打印(“生成文档!”)
类ProgramThread(threading.Thread):
def运行(自):
而不是myapp.getEventListenerStatus():
时间。睡眠(1.0)
打印(“检查生成按钮”)
生成文档()
myapp=应用程序()
myapp.addEventListener(“按钮”、“XMLGenerateReport”)
thr=ProgramThread()
thr.start()
Window.py:

从PySide2.qtuitols导入QUiLoader
从PySide2.QtWidgets导入QApplication、QPushButton、QFileDialog、QWidget、QLineEdit
从PySide2.QtCore导入QFile
从PySide2导入QtWidgets
导入系统
导入线程
类应用程序(qtwidts.QWidget):
elementtype={
“按钮”:QPushButton
}
eventlistenerresult=None
app=无
__小部件=无
XMLButtonFolder=None
ReportButtonFolder=无
定义初始化(自):
self.app=QApplication([])
加载器=QUiLoader()
打印(“加载mainwindow.ui文件”)
self.window=loader.load(QFile(“mainwindow.ui”))
如果self.window不是None:
打印(“mainwindow.ui已加载”)
其他:
打印(“加载mainwindow.ui时出错”)
#XML
self.XMLButtonFolder=self.window.findChild(QPushButton,“XMLButtonFolder”)
self.XMLButtonFolder.clicked.connect(self.openBoxFolder_XML)
#报告
self.ReportButtonFolder=self.window.findChild(QPushButton,“ReportButtonFolder”)
self.ReportButtonFolder.clicked.connect(self.openBoxFolder\u报告)
#如果取消对以下行的注释,将正确调用eventListener()方法。。
#self.window.findChild(QPushButton,“XMLGenerateReport”)。单击。连接(self.eventListener)
self.window.show()
sys.exit(self.app.exec)
def openBoxFolder_XML(自):
#工作
dialog=qtwidts.QFileDialog(self.window)
dialog.setFileMode(QFileDialog.ExistingFile)
路径,=dialog.getOpenFileName(self.window,'Sélectionnez un fichier.xml',filter='xml files(*.xml'))
self.window.findChild(QLineEdit,“XMLInputFolder”).setText(路径)
def openBoxFolder_报告(自我):
#工作
dialog=QFileDialog(self.window)
setFileMode(QFileDialog.Directory)
路径,\=dialog.getOpenFileName()
self.window.findChild(QLineEdit,“ReportInputFolder”).setText(路径)
def addEventListener(self、qtype、qname):
self.eventlistenerresult=False
self.window.findChild(self.elementtype[qtype],qname).单击.connect(self.eventListener)
def eventListener(自):
#从未打过电话
打印(“单击!”)
self.eventlistenerresult=True
def getEventListenerStatus(自身):
return self.eventlistenerresult#如果已按下addEventListener处理的按钮,则返回true
mainwindow.ui:


主窗口
0
0
696
222
主窗口
40
60
531
20
htmlhead/bodypEntrez ici le dossier oùce trouve le fichier.xmláusiver/p/body/html
40
40
171
16
docsier contenant les fichiers.XML
40
150
75
23
生成
40
110
531
20
class Application(QtWidgets.QWidget):
    # ...

    def __init__(self):
        # ...
        self.ReportButtonFolder.clicked.connect(self.openBoxFolder_Report)

        # If you uncomment the following line, the eventListener() method will be correctly called ..
        # self.window.findChild(QPushButton, "XMLGenerateReport").clicked.connect(self.eventListener)
        self.window.show()

    def run(self):
        return self.app.exec_()
# ...
myapp = Application()
myapp.addEventListener("Button", "XMLGenerateReport")
thr = ProgramThread()
thr.start()
sys.exit(myapp.run())
import sys
from PySide2 import QtCore, QtWidgets, QtUiTools


class Application:
    def __init__(self, arguments):
        self.app = QtWidgets.QApplication(arguments)
        loader = QtUiTools.QUiLoader()
        print("Loading mainwindow.ui file")
        self.window = loader.load(QtCore.QFile("mainwindow.ui"))
        if self.window is not None:
            print("mainwindow.ui loaded")
        else:
            print("Error loading mainwindow.ui")
            sys.exit(-1)

        self.XMLButtonFolder = self.window.findChild(
            QtWidgets.QPushButton, "XMLButtonFolder"
        )
        self.ReportButtonFolder = self.window.findChild(
            QtWidgets.QPushButton, "ReportButtonFolder"
        )
        self.XMLInputFolder = self.window.findChild(
            QtWidgets.QLineEdit, "XMLInputFolder"
        )
        self.ReportInputFolder = self.window.findChild(
            QtWidgets.QLineEdit, "ReportInputFolder"
        )
        self.XMLGenerateReport = self.window.findChild(
            QtWidgets.QPushButton, "XMLGenerateReport"
        )

        self.ReportButtonFolder.clicked.connect(self.openBoxFolder_Report)
        self.XMLButtonFolder.clicked.connect(self.openBoxFolder_XML)

        # If you uncomment the following line, the eventListener() method will be correctly called ..
        # self.window.findChild(QPushButton, "XMLGenerateReport").clicked.connect(self.eventListener)
        self.window.show()

    def run(self):
        return self.app.exec_()

    def openBoxFolder_XML(self):
        # Works
        dialog = QtWidgets.QFileDialog(self.window)
        dialog.setFileMode(QFileDialog.ExistingFile)
        path, _ = dialog.getOpenFileName(
            self.window,
            "Sélectionnez un fichier .xml",
            filter="XML files (*.xml)",
        )
        self.XMLInputFolder.setText(path)

    def openBoxFolder_Report(self):
        # Works
        dialog = QFileDialog(self.window)
        dialog.setFileMode(QFileDialog.Directory)
        path, _ = dialog.getOpenFileName()
        self.ReportInputFolder.setText(path)
import sys
from PySide2 import QtCore

from Window import Application


def GenerateDocument():
    print("Document generated !")


class Worker(QtCore.QObject):
    @QtCore.Slot()
    def task(self):
        GenerateDocument()


if __name__ == "__main__":
    myapp = Application(sys.argv)

    thread = QtCore.QThread()
    thread.start()

    worker = Worker()
    worker.moveToThread(thread)

    myapp.XMLGenerateReport.clicked.connect(worker.task)

    res = myapp.run()

    thread.quit()
    thread.wait()

    sys.exit(res)