Проблемы совместимости Mojave с Pyinstaller и PyQt5 macOS - PullRequest
0 голосов
/ 12 июня 2019

Мое приложение, созданное с помощью Pyinstaller, работало до тех пор, пока я не перешел с High Sierra на Mojave. Чтобы продемонстрировать проблему, я создаю простое приложение. Главное окно имеет только одну кнопку. При нажатии кнопки ее текст должен быть изменен на «Пожалуйста, подождите» в течение 10 секунд. Когда я запускаю эту программу как скрипт .py, все работает нормально, но после создания файла .app с помощью Pyinstaller он ведет себя по-другому. Текст не обновляется, пока вы не нажмете где-нибудь за пределами окна.

Я попытался переустановить 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_())

1 Ответ

0 голосов
/ 25 июня 2019

Я нашел ответ на свой вопрос. Чтобы решить эту проблему рендеринга, вам нужно добавить следующую строку для элемента пользовательского интерфейса, который необходимо обновить. В моем случае это требуется только в том случае, если мне нужно запустить это приложение на MacOS Mojave.

<element>.repaint()

Например:

def click(self):             
        self.pushButton.setEnabled(False)
        self.pushButton.setText("Button is clicked...")
        self.pushButton.repaint()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...