Форум сайта python.su
Прошу не оскорбляться таким заголовком темы.
Решил я перейти на 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_())
Отредактировано Kyrym (Сен. 22, 2017 08:19:22)
Офлайн
Kyrym
Пример кода, который в 5-ке перестал работать:
>>> from PyQt5.Qt import * >>> help(QFileDialog.getOpenFileName) Help on built-in function getOpenFileName: getOpenFileName(...) getOpenFileName(...) -> Tuple[str, str] >>> help(QFileDialog.getSaveFileName) Help on built-in function getSaveFileName: getSaveFileName(...) getSaveFileName(...) -> Tuple[str, str]
Отредактировано vic57 (Сен. 22, 2017 04:28:27)
Офлайн
vic57, и что сиё значит?
Отредактировано Kyrym (Сен. 22, 2017 08:16:50)
Офлайн
>>> from PyQt4.Qt import * >>> help(QFileDialog.getOpenFileName) Help on built-in function getOpenFileName: getOpenFileName(...) getOpenFileName(...) -> str
Офлайн
Это называется: “найдите 10 отличий”…
Ничего не понятно.
Офлайн
getOpenFileName(…) ->str
getOpenFileName(…) -> Tuple
Отредактировано vic57 (Сен. 22, 2017 10:16:01)
Офлайн
Это я увидел, но что с того? Причём тут открытие файла? Я спрашиваю про сохранение. Тем более getSaveFileName у меня идёт с кортежем.
“(self, ”Сохранить как“, ”Отчёт“, ”Text Files (*.txt)“, options=options)” - это всё разве не кортеж?
Функцию сохранения я позаимствовал из книги "Горожанов. PyQt5 для лингвистов_2014"
Отредактировано Kyrym (Сен. 22, 2017 10:34:16)
Офлайн
Kyrym
self.fileName = QFileDialog.getSaveFileName(self, “Сохранить как”, “Отчёт”,
“Text Files (*.txt)”, options=options)
Горожанов
self.fileName, _ =
QtWidgets.QFileDialog.getSaveFileName(self, “Save To File”, “”, “Text Files (*.txt)”, options=options)
Офлайн
Так дело было в ", _" !!!
А что это вообще за синтаксис такой? Я-то думал, что это опечатка.
——
Ну а вообще, с PyQt5 есть проблемы или он нормально работает?
Офлайн
Kyrymмлин ну вам же написали выше, разжую, в четвертом КуТ возвращает строку, а в пятом список из двух строк, вам нужен только первый элемент списка.. но возвращает то оно два значения, поэтому и используют подчеркивание “_” как имя переменной для второго значения, которое потом никому не нужно.
А что это вообще за синтаксис такой? Я-то думал, что это опечатка.
... fileName = QFileDialog.getSaveFileName(self, "Сохранить как", "Отчёт", "Text Files (*.txt)", options=options) self.fileName = fileName[0] ...
[code python][/code]
Офлайн