Pyinstaller 和 PyQt5 macOS Mojave 兼容性问题

Pyinstaller and PyQt5 macOS Mojave compatibility issues

我的应用程序是用 Pyinstaller 创建的,在我从 High Sierra 升级到 Mojave 之前运行良好。为了演示这个问题,我创建了一个简单的应用程序。 Main window 只有一个按钮。当您按下按钮时,其文本应更改为 "Please wait" 10 秒。 当我 运行 此程序作为 .py 脚本时,一切正常,但在使用 Pyinstaller 创建 .app 文件后,它的行为有所不同。在您单击 window 之外的任何地方之前,文本不会更新。

我尝试重装Pyinstaller,问题依旧。

from PyQt5 import QtCore, QtGui, QtWidgets
import time

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(303, 304)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(50, 80, 300, 43))
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(80, 170, 113, 32))
        self.pushButton.setObjectName("pushButton")
        self.pushButton.setDefault(True)
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

        self.pushButton.clicked.connect(self.click)
        self.thread = Thread()
        self.thread.finished.connect(lambda: self.pushButton.setEnabled(True))


    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "Click me"))


    def click(self):
        if not self.thread.isRunning():
            self.pushButton.setEnabled(False)
            self.pushButton.setText("Please wait")
            self.label.setText("The button below should display \n 'Please wait' for 10 seconds")
            self.thread.start()

class Thread(QtCore.QThread):
    def run(self):

        time.sleep(10)
        ui.pushButton.setEnabled(False)
        ui.pushButton.setText("Click me") 
        ui.label.setText("")



if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

我找到了问题的答案。为了解决此渲染问题,您需要为需要更新的 ui 元素添加以下行。在我的例子中,只有当我需要在 macOS Mojave 上 运行 这个应用程序时,它才是 required。

<element>.repaint()

例如:

def click(self):             
        self.pushButton.setEnabled(False)
        self.pushButton.setText("Button is clicked...")
        self.pushButton.repaint()