Pyinstaller和PyQt5 macOS Mojave兼容性问题

Pyinstaller和PyQt5 macOS Mojave兼容性问题

问题描述:

使用Pyinstaller创建的应用程序运行良好,直到我从High Sierra升级到Mojave.为了演示该问题,我创建了一个简单的应用程序. 主窗口只有一个按钮.当您按下按钮时,其文本应更改为请稍候" 10秒钟. 当我以.py脚本运行该程序时,一切正常,但是使用Pyinstaller创建.app文件后,其行为会有所不同.除非您单击窗口之外的任何位置,否则文本不会更新.

My application, created with Pyinstaller, worked fine until I upgraded from High Sierra to Mojave. In order to demonstrate the issue I create the simple application. Main window has only one button. When you press the button its text should be changed to "Please wait" for 10 seconds. When I run this program as .py script, everything works fine, but after creating .app file with Pyinstaller it behaves differently. The text is not updated until you click anywhere outside of the window.

我试图重新安装Pyinstaller,但问题仍然存在.

I tried to reinstall Pyinstaller, but the problem still exists.

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上运行此应用程序时才需要.

I found an answer to my question. In order to solve this rendering issue you need to add the following line for a ui element, which needs to be updated. In my case it is required only if I need to run this application on macOS Mojave.

<element>.repaint()

例如:

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