Ошибка "RuntimeError: super-class __init__() of type Morse was never called" PyQt5
Возникает ошибка:
RuntimeError: super-class init() of type Morse was never called,
хотя класс __init__ используется.
Также написано, что ошибка на 59 строке. Программа работает, если убрать все классы, кроме MyWidget, но их нужно оставить. Для запуска требуется дизайн программы, который расположен в отдельном файле, его тоже прилагаю.
Основной код:
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
from Design import Ui_form
class MyWidget(QtWidgets.QMainWindow, Ui_form):
def __init__(self):
super().__init__()
self.setupUi(self)
self.run_button.clicked.connect(self.run)
def run(self):
if self.encrypt.isChecked():
if self.comboBox.activated[str]:
Morse().convert(self.input.toPlainText())
class Morse(MyWidget):
def __init__(self):
self.rus_to_morse = {'а': '.-',
'б': '-...',
'в': '.--',
'г': '--.',
'д': '-..',
'е': '.',
'ж': '...-',
'з': '--..',
'и': '..',
'й': '.---',
'к': '-.-',
'л': '.-..',
'м': '--',
'н': '-.',
'о': '---',
'п': '.--.',
'р': '.-.',
'с': '...',
'т': '-',
'у': '..-',
'ф': '..-.',
'х': '....',
'ц': '-.-.',
'ч': '---.',
'ш': '----',
'щ': '--.-',
'ъ': '.--.-.',
'ы': '-.--',
'ь': '-..-',
'э': '..-..',
'ю': '..--',
'я': '.-.-'}
self.o = []
def convert(self, wordd):
for i in wordd.split():
self.o.append(" ".join(self.rus_to_morse[simv] for simv in i.lower()))
print(wordd.split())
print(wordd)
print(self.o)
print(" ".join(self.o))
self.output.setText(" ".join(self.o))
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
ex = MyWidget()
ex.show()
sys.exit(app.exec_())
Дизайн:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'DESIGN.ui'
#
# Created by: PyQt5 UI code generator 5.15.1
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_form(object):
def setupUi(self, form):
form.setObjectName("form")
form.resize(735, 847)
self.comboBox = QtWidgets.QComboBox(form)
self.comboBox.setGeometry(QtCore.QRect(230, 90, 281, 41))
self.comboBox.setObjectName("comboBox")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.label = QtWidgets.QLabel(form)
self.label.setGeometry(QtCore.QRect(260, 20, 231, 61))
font = QtGui.QFont()
font.setPointSize(22)
self.label.setFont(font)
self.label.setObjectName("label")
self.label_4 = QtWidgets.QLabel(form)
self.label_4.setGeometry(QtCore.QRect(300, 300, 131, 31))
font = QtGui.QFont()
font.setPointSize(14)
self.label_4.setFont(font)
self.label_4.setObjectName("label_4")
self.label_2 = QtWidgets.QLabel(form)
self.label_2.setGeometry(QtCore.QRect(320, 140, 111, 21))
font = QtGui.QFont()
font.setPointSize(14)
self.label_2.setFont(font)
self.label_2.setObjectName("label_2")
self.encrypt = QtWidgets.QRadioButton(form)
self.encrypt.setGeometry(QtCore.QRect(190, 170, 141, 31))
font = QtGui.QFont()
font.setPointSize(10)
self.encrypt.setFont(font)
self.encrypt.setObjectName("encrypt")
self.decrypt = QtWidgets.QRadioButton(form)
self.decrypt.setGeometry(QtCore.QRect(420, 170, 151, 31))
font = QtGui.QFont()
font.setPointSize(10)
self.decrypt.setFont(font)
self.decrypt.setObjectName("decrypt")
self.label_3 = QtWidgets.QLabel(form)
self.label_3.setGeometry(QtCore.QRect(100, 210, 561, 31))
font = QtGui.QFont()
font.setPointSize(12)
self.label_3.setFont(font)
self.label_3.setObjectName("label_3")
self.key_line = QtWidgets.QLineEdit(form)
self.key_line.setEnabled(True)
self.key_line.setGeometry(QtCore.QRect(160, 250, 431, 41))
self.key_line.setAutoFillBackground(False)
self.key_line.setFrame(True)
self.key_line.setEchoMode(QtWidgets.QLineEdit.Normal)
self.key_line.setReadOnly(False)
self.key_line.setClearButtonEnabled(False)
self.key_line.setObjectName("key_line")
self.output = QtWidgets.QTextBrowser(form)
self.output.setGeometry(QtCore.QRect(50, 640, 651, 192))
self.output.setObjectName("output")
self.run_button = QtWidgets.QPushButton(form)
self.run_button.setGeometry(QtCore.QRect(280, 540, 181, 41))
font = QtGui.QFont()
font.setPointSize(10)
self.run_button.setFont(font)
self.run_button.setObjectName("run_button")
self.line = QtWidgets.QFrame(form)
self.line.setGeometry(QtCore.QRect(0, 590, 751, 20))
self.line.setFrameShape(QtWidgets.QFrame.HLine)
self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
self.line.setObjectName("line")
self.label_5 = QtWidgets.QLabel(form)
self.label_5.setGeometry(QtCore.QRect(260, 600, 221, 41))
font = QtGui.QFont()
font.setPointSize(14)
self.label_5.setFont(font)
self.label_5.setObjectName("label_5")
self.input = QtWidgets.QTextEdit(form)
self.input.setGeometry(QtCore.QRect(50, 340, 651, 191))
self.input.setObjectName("input")
self.retranslateUi(form)
QtCore.QMetaObject.connectSlotsByName(form)
def retranslateUi(self, form):
_translate = QtCore.QCoreApplication.translate
form.setWindowTitle(_translate("form", "Программа для шифрования"))
self.comboBox.setCurrentText(_translate("form", "Азбука Морзе"))
self.comboBox.setItemText(0, _translate("form", "Азбука Морзе"))
self.comboBox.setItemText(1, _translate("form", "Шифр Цезаря"))
self.comboBox.setItemText(2, _translate("form", "Шифр Вижнера"))
self.comboBox.setItemText(3, _translate("form", "Шифр Гронсфельда"))
self.label.setText(_translate("form", "Выберете шифр:"))
self.label_4.setText(_translate("form", "Введите текст:"))
self.label_2.setText(_translate("form", "Вы хотите..."))
self.encrypt.setText(_translate("form", "Зашифровать текст"))
self.decrypt.setText(_translate("form", "Расшифровать текст"))
self.label_3.setText(_translate("form", "Введите ключ(буквенный для ш. Вижнера, циферный для ш. Гронсфельда): "))
self.run_button.setText(_translate("form", "Преобразовать текст"))
self.label_5.setText(_translate("form", "Преобразованный текст:"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
form = QtWidgets.QWidget()
ui = Ui_form()
ui.setupUi(form)
form.show()
sys.exit(app.exec_())
Ответы (2 шт):
Автор решения: alex
→ Ссылка
потому что после наследования от класса и перекрытия метода __init__() следует вызывать родительский __init__. в данном случае
class Morse(MyWidget):
def __init__(self):
self.rus_to_morse = {'а': '.-',
'б': '-...',
'в': '.--',
'г': '--.',
'д':
...
super().__init__()
Забавный факт, в классе MyWidget родительский init вы все таки вызвали
Автор решения: S. Nick
→ Ссылка
Я отметил для вас строки, в которые внес изменения. Попробуйте:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
#from Design import Ui_form
class Ui_form(object):
def setupUi(self, form):
form.setObjectName("form")
form.resize(735, 847)
self.comboBox = QtWidgets.QComboBox(form)
self.comboBox.setGeometry(QtCore.QRect(230, 90, 281, 41))
self.comboBox.setObjectName("comboBox")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.label = QtWidgets.QLabel(form)
self.label.setGeometry(QtCore.QRect(260, 20, 231, 61))
font = QtGui.QFont()
font.setPointSize(22)
self.label.setFont(font)
self.label.setObjectName("label")
self.label_4 = QtWidgets.QLabel(form)
self.label_4.setGeometry(QtCore.QRect(300, 300, 131, 31))
font = QtGui.QFont()
font.setPointSize(14)
self.label_4.setFont(font)
self.label_4.setObjectName("label_4")
self.label_2 = QtWidgets.QLabel(form)
self.label_2.setGeometry(QtCore.QRect(320, 140, 111, 21))
font = QtGui.QFont()
font.setPointSize(14)
self.label_2.setFont(font)
self.label_2.setObjectName("label_2")
self.encrypt = QtWidgets.QRadioButton(form)
self.encrypt.setGeometry(QtCore.QRect(190, 170, 141, 31))
font = QtGui.QFont()
font.setPointSize(10)
self.encrypt.setFont(font)
self.encrypt.setObjectName("encrypt")
self.decrypt = QtWidgets.QRadioButton(form)
self.decrypt.setGeometry(QtCore.QRect(420, 170, 151, 31))
font = QtGui.QFont()
font.setPointSize(10)
self.decrypt.setFont(font)
self.decrypt.setObjectName("decrypt")
self.label_3 = QtWidgets.QLabel(form)
self.label_3.setGeometry(QtCore.QRect(100, 210, 561, 31))
font = QtGui.QFont()
font.setPointSize(12)
self.label_3.setFont(font)
self.label_3.setObjectName("label_3")
self.key_line = QtWidgets.QLineEdit(form)
self.key_line.setEnabled(True)
self.key_line.setGeometry(QtCore.QRect(160, 250, 431, 41))
self.key_line.setAutoFillBackground(False)
self.key_line.setFrame(True)
self.key_line.setEchoMode(QtWidgets.QLineEdit.Normal)
self.key_line.setReadOnly(False)
self.key_line.setClearButtonEnabled(False)
self.key_line.setObjectName("key_line")
self.output = QtWidgets.QTextBrowser(form)
self.output.setGeometry(QtCore.QRect(50, 640, 651, 192))
self.output.setObjectName("output")
font = QtGui.QFont() # +
font.setPointSize(22) # +
self.output.setFont(font) # +
self.run_button = QtWidgets.QPushButton(form)
self.run_button.setGeometry(QtCore.QRect(280, 540, 181, 41))
font = QtGui.QFont()
font.setPointSize(10)
self.run_button.setFont(font)
self.run_button.setObjectName("run_button")
self.line = QtWidgets.QFrame(form)
self.line.setGeometry(QtCore.QRect(0, 590, 751, 20))
self.line.setFrameShape(QtWidgets.QFrame.HLine)
self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
self.line.setObjectName("line")
self.label_5 = QtWidgets.QLabel(form)
self.label_5.setGeometry(QtCore.QRect(260, 600, 221, 41))
font = QtGui.QFont()
font.setPointSize(14)
self.label_5.setFont(font)
self.label_5.setObjectName("label_5")
self.input = QtWidgets.QTextEdit(form)
self.input.setGeometry(QtCore.QRect(50, 340, 651, 191))
self.input.setObjectName("input")
self.retranslateUi(form)
QtCore.QMetaObject.connectSlotsByName(form)
def retranslateUi(self, form):
_translate = QtCore.QCoreApplication.translate
form.setWindowTitle(_translate("form", "Программа для шифрования"))
self.comboBox.setCurrentText(_translate("form", "Азбука Морзе"))
self.comboBox.setItemText(0, _translate("form", "Азбука Морзе"))
self.comboBox.setItemText(1, _translate("form", "Шифр Цезаря"))
self.comboBox.setItemText(2, _translate("form", "Шифр Вижнера"))
self.comboBox.setItemText(3, _translate("form", "Шифр Гронсфельда"))
self.label.setText(_translate("form", "Выберете шифр:"))
self.label_4.setText(_translate("form", "Введите текст:"))
self.label_2.setText(_translate("form", "Вы хотите..."))
self.encrypt.setText(_translate("form", "Зашифровать текст"))
self.decrypt.setText(_translate("form", "Расшифровать текст"))
self.label_3.setText(_translate("form", "Введите ключ(буквенный для ш. Вижнера, циферный для ш. Гронсфельда): "))
self.run_button.setText(_translate("form", "Преобразовать текст"))
self.label_5.setText(_translate("form", "Преобразованный текст:"))
class Morse(QtCore.QObject): # - MyWidget
def __init__(self, parent=None): # parent
super(Morse, self).__init__(parent) # parent
self.parent = parent # parent
self.rus_to_morse = {
'а': '.-', 'б': '-...', 'в': '.--', 'г': '--.', 'д': '-..',
'е': '.', 'ж': '...-', 'з': '--..', 'и': '..', 'й': '.---',
'к': '-.-', 'л': '.-..', 'м': '--', 'н': '-.', 'о': '---',
'п': '.--.', 'р': '.-.', 'с': '...', 'т': '-', 'у': '..-',
'ф': '..-.', 'х': '....', 'ц': '-.-.', 'ч': '---.', 'ш': '----',
'щ': '--.-', 'ъ': '.--.-.', 'ы': '-.--', 'ь': '-..-',
'э': '..-..', 'ю': '..--', 'я': '.-.-'}
self.o = []
def convert(self, wordd):
for i in wordd.split():
self.o.append(" ".join(self.rus_to_morse[simv] for simv in i.lower()))
print(wordd.split())
print(wordd)
print(self.o)
print(" ".join(self.o))
# self.output.setText(" ".join(self.o))
self.parent.output.setText(" ".join(self.o)) # parent
class MyWidget(QtWidgets.QMainWindow, Ui_form):
def __init__(self):
super().__init__()
self.setupUi(self)
self.morse = Morse(self) # !!!
self.run_button.clicked.connect(self.run)
def run(self):
if self.encrypt.isChecked():
if self.comboBox.activated[str]:
# Morse().convert(self.input.toPlainText())
self.morse.convert(self.input.toPlainText()) # !!!
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
ex = MyWidget()
ex.show()
sys.exit(app.exec_())
