python - Pyinstaller 和 PyQt5 macOS Mojave 兼容性问题

标签 python pyqt pyqt5 pyinstaller macos-mojave

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

我尝试重新安装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 上运行此应用程序时才需要。

<element>.repaint()

例如:

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

关于python - Pyinstaller 和 PyQt5 macOS Mojave 兼容性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56553257/

相关文章:

python - 如何关闭 QDialog

python - Matplotlib 图与 PyQt5/PySide2 QSplitter Widget 之间的问题

python - 如何使用 PyQt5 设置窗口图标?

python - 从 PyQt5 QPlainTextEdit 获取 Unicode 字符串

python - 使用函数返回的变量时出现名称错误

Python 3.7 : Inheriting list, 摘要被忽略

python - pandas dtype 和 dtypes 有什么区别

python - 如何阻止图像被推离屏幕?

python 如何从 QTabwidget 获取选项卡名称

python - .get 元组与字典