Решил я перейти на PyQt5, переделал код ряда программ на данную версию, собственно, сложного вроде бы ничего. Однако, некоторые функции, которые, между прочим, обязаны работать в пятёрке, порождают “ошибки” и программа вылетает.
Я использовал портативные версии PyQt5 (WinPython-64bit-3.4.4.6-Qt5, а версия WinPython-64bit-3.6.2.0-Qt5 даже распаковалась в самом конце с ошибками, причём дистрибутивы качал несколько раз на двух компах).
Вот и хочу узнать у спецов, где искать проблему.
Мне на ум приходят следующие варианты:
1) портативные версии PyQt5 нестабильны (глючны). С портативной 4-кой таких проблем не было.
2) ошибка в коде - ну это вряд ли, хотя может надо где-то что-то добавить?
3) что-то не так вообще с пятой версией и лучше использовать четвёртую? - в этот вариант я не верю.
4) … свой вариант…
Пример кода, который в 5-ке перестал работать:
def saveToFile(self): options = QFileDialog.Options() self.fileName = QFileDialog.getSaveFileName(self, "Сохранить как", "Отчёт", "Text Files (*.txt)", options=options) if self.fileName: self.writeFile = open(self.fileName, 'w', encoding='utf-8') self.writeFile.write(self.pole_vivod.toPlainText()) self.writeFile.close()
———————–
Добавлено
Вот набросал пример из тестовой программки:
# Python 3. PyQt5 # -*- coding: utf-8 -*- import sys from PyQt5 import QtCore, QtWidgets, QtGui from PyQt5.QtWidgets import * # Графика class Window(QWidget): # Класс Window наследует класс QWidget def __init__(self, parent=None): QWidget.__init__(self, parent) self.resize(300, 300) self.setWindowTitle('Расчёт объёма') # Заголовок # БЛОК СОЗДАНИЯ LABEL self.lbl_a = QLabel('Длина a =') self.lbl_b = QLabel('Ширина b =') self.lbl_h = QLabel('Высота h =') self.lbl_vivod = QLabel('Расчёт') self.lbl_vvod = QLabel('Ввод') self.lbl_help = QLabel() # Создаём текстовую строку # БЛОК СОЗДАНИЯ ПОЛЕЙ self.pole_a = QLineEdit('10') self.pole_b = QLineEdit('6') self.pole_h = QLineEdit('2') self.pole_vivod = QTextEdit() # Показывает ход вычислений self.pole_vvod = QLineEdit() # БЛОК СОЗДАНИЯ КНОПОК self.button_1 = QPushButton('Ввести') self.button_2 = QPushButton('Расчёт') # Запуск расчёта self.button_2.clicked.connect(self.on_click) self.button_save_isd = QPushButton('Сохранить отчёт') self.button_save_isd.clicked.connect(self.saveToFile) # БЛОК РАЗМЕТКИ grid = QGridLayout() # создание сетки grid.setSpacing(5) # Устанавливает расстояние между компонентами grid.addWidget(self.button_save_isd, 0, 0) grid.addWidget(self.lbl_a, 1, 0) grid.addWidget(self.pole_a, 1, 1) grid.addWidget(self.lbl_b, 2, 0) grid.addWidget(self.pole_b, 2, 1) grid.addWidget(self.lbl_h, 3, 0) grid.addWidget(self.pole_h, 3, 1) grid.addWidget(self.lbl_vivod, 4, 0) grid.addWidget(self.pole_vivod, 4,1,1,2) grid.addWidget(self.button_2, 0, 2) grid.addWidget(self.lbl_vvod, 5, 0) grid.addWidget(self.pole_vvod, 5,1,1,1) grid.addWidget(self.button_1, 5, 2) grid.addWidget(self.lbl_help, 1, 2) self.setLayout(grid) # установка менеджера компоновки self.on_click() # ЛОГИКА def on_click(self): def ap(i): # ap('aa') data.append(i) def aps(i): # aps(['aa','aa']) i = ''.join(map(str, i)) data.append(str(i)) data = [] self.pole_vivod.setText('') a = float(self.pole_a.text()) b = float(self.pole_b.text()) h = float(self.pole_h.text()) V = a*b*h aps(["V = a∙b∙h = ",a,"∙",b,"∙",h," = ",V]) for i in data: self.pole_vivod.append(str(i)) def saveToFile(self): options = QFileDialog.Options() self.fileName = QFileDialog.getSaveFileName(self, "Сохранить как", "Отчёт", "Text Files (*.txt)", options=options) if self.fileName: self.writeFile = open(self.fileName, 'w', encoding='utf-8') self.writeFile.write(self.pole_vivod.toPlainText()) self.writeFile.close() def closeEvent(self, event): choice=QMessageBox.question(self,'Сообщение','Выйти?',QMessageBox.Yes,QMessageBox.No) if choice==QMessageBox.Yes: event.accept() else: event.ignore() # КОНЕЦ if __name__ == "__main__": app = QApplication(sys.argv) window = Window() # создаёт экземпляр окна из класса window.show() # запускает окно sys.exit(app.exec_())
А вот функция closeEvent именно сейчас заработала, а в другой программе не хотела. Код один и тот же.