Pyinstaller and PyQt5 macOS Mojave compatibility issues

南笙酒味 提交于 2019-12-02 13:05:02

问题


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.

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_())

回答1:


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()

For example:

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


来源:https://stackoverflow.com/questions/56553257/pyinstaller-and-pyqt5-macos-mojave-compatibility-issues

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!