Найти - Пользователи
Полная версия: PyQt 5 работает нестабильно?
Начало » GUI » PyQt 5 работает нестабильно?
1 2
Kyrym
Прошу не оскорбляться таким заголовком темы.
Решил я перейти на 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 именно сейчас заработала, а в другой программе не хотела. Код один и тот же.
vic57
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]
Kyrym
vic57, и что сиё значит?

vic57
 >>> from PyQt4.Qt import *
>>> help(QFileDialog.getOpenFileName)
Help on built-in function getOpenFileName:
getOpenFileName(...)
    getOpenFileName(...) -> str
Kyrym
Это называется: “найдите 10 отличий”…
Ничего не понятно.
vic57

getOpenFileName(…) ->str
getOpenFileName(…) -> Tuple

Kyrym
Это я увидел, но что с того? Причём тут открытие файла? Я спрашиваю про сохранение. Тем более getSaveFileName у меня идёт с кортежем.
“(self, ”Сохранить как“, ”Отчёт“, ”Text Files (*.txt)“, options=options)” - это всё разве не кортеж?

Функцию сохранения я позаимствовал из книги "Горожанов. PyQt5 для лингвистов_2014"
vic57
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)
Kyrym
Так дело было в ", _" !!!
А что это вообще за синтаксис такой? Я-то думал, что это опечатка.
——
Ну а вообще, с PyQt5 есть проблемы или он нормально работает?
PEHDOM
Kyrym
А что это вообще за синтаксис такой? Я-то думал, что это опечатка.
млин ну вам же написали выше, разжую, в четвертом КуТ возвращает строку, а в пятом список из двух строк, вам нужен только первый элемент списка.. но возвращает то оно два значения, поэтому и используют подчеркивание “_” как имя переменной для второго значения, которое потом никому не нужно.
можете сделать по другому, если так будет понятнее:
 ...
fileName = QFileDialog.getSaveFileName(self, "Сохранить как", "Отчёт",
                                                          "Text Files (*.txt)", options=options)
self.fileName = fileName[0]
...
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB