Python (PyQt5) При нажатии на кнопку Cancel выдаёт ошибку

При нажатии на кнопку Close ничего не происходит, использую питон 3.7

main.py

from PyQt5 import QtCore, QtGui, QtWidgets

import signals


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(250, 420)
        MainWindow.setMinimumSize(QtCore.QSize(250, 420))
        MainWindow.setMaximumSize(QtCore.QSize(250, 420))
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 250, 22))
        self.menubar.setObjectName("menubar")
        self.settings = QtWidgets.QMenu(self.menubar)
        self.settings.setObjectName("settings")
        self.microphone_settings = QtWidgets.QMenu(self.settings)
        self.microphone_settings.setObjectName("
            microphone_settings")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.chose_microphone = QtWidgets.QAction(MainWindow)
        self.chose_microphone.setObjectName("chose_microphone")
        self.microphone_settings.addAction(self.chose_microphone)
        self.settings.addAction(
        self.microphone_settings.menuAction())
        self.menubar.addAction(self.settings.menuAction())

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

        self.add_funk()

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle("MainWindow")
        self.settings.setTitle(_translate("MainWindow", 
            "Настройки"))
        self.microphone_settings.setTitle(_translate("MainWindow", 
            "Микрофон"))
        self.chose_microphone.setText(_translate("MainWindow", 
            "Выбор устройства..."))


    def add_funk(self):
        self.chose_microphone.triggered.connect(lambda: 
            signals.choice_micro(True))

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_())

choise.py

from PyQt5 import QtCore, QtGui, QtWidgets

import speech_recognition as SR
import signals

chosen_mic = ""

class Ui_Choise_mic(object):
    def setupUi(self, Choise_mic):
        Choise_mic.setObjectName("Choise_mic")
        Choise_mic.resize(500, 70)
        sizePolicy = 
            QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, 
            QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            Choise_mic.sizePolicy().hasHeightForWidth())
        Choise_mic.setSizePolicy(sizePolicy)
        Choise_mic.setMinimumSize(QtCore.QSize(500, 70))
        Choise_mic.setMaximumSize(QtCore.QSize(500, 70))
        self.comboBox = QtWidgets.QComboBox(Choise_mic)
        self.comboBox.setGeometry(QtCore.QRect(10, 10, 481, 22))
        self.comboBox.setObjectName("comboBox")
        self.ok = QtWidgets.QPushButton(Choise_mic)
        self.ok.setGeometry(QtCore.QRect(10, 40, 75, 24))
        self.ok.setObjectName("ok")
        self.cancel = QtWidgets.QPushButton(Choise_mic)
        self.cancel.setGeometry(QtCore.QRect(420, 40, 75, 24))
        self.cancel.setObjectName("cancel")

        self.retranslateUi(Choise_mic)
        QtCore.QMetaObject.connectSlotsByName(Choise_mic)

        self.add_funk()
        self.add_funk_btn()


    def retranslateUi(self, Choise_mic):
        _translate = QtCore.QCoreApplication.translate
        Choise_mic.setWindowTitle(_translate("Choise_mic", "Выбор 
            микрофона"))
        self.ok.setText(_translate("Choise_mic", "Ок"))
        self.cancel.setText(_translate("Choise_mic", "Отмена"))

    def add_funk(self):
        list_mic = SR.Microphone().list_microphone_names()
        self.comboBox.addItems(list_mic)
        if self.comboBox.currentTextChanged.connect(lambda: 
            self.text_changed()):
            self.text_changed()


    def text_changed(self):
        global chosen_mic
        chosen_mic = SR.Microphone.list_microphone_names().index(
            self.comboBox.currentText())


    def add_funk_btn(self):
        self.ok.clicked.connect(lambda: self.Ok())
        self.cancel.clicked.connect(lambda: self.Cansel())

    def Cansel(self): #!!!
        signals.choice_micro(False)

    def Ok(self):
        # *часть для сохранения в json файл (удалена за 
            ненадобностью в демонстрации)
        signals.choice_micro(False)

sygnals.py

from PyQt5 import QtCore, QtGui, QtWidgets
from choise import Ui_Choise_mic

import choise


class NewWindowChoiceMic(QtWidgets.QWidget, Ui_Choise_mic):
    def __init__(self, parent=None):
        super(NewWindowChoiceMic, self).__init__(parent)
        self.setupUi(self)


    def choice_micro(signal): #!!!
        choi_mic = NewWindowChoiceMic()
        if signal:
            choi_mic.show()
        else:
            choi_mic.hide()

Ответы (1 шт):

Автор решения: S. Nick

НИКОГДА НЕ ИЗМЕНЯЙТЕ код, сгенерированный Qt Designer, НИКОГДА.
Создайте другой класс, который наследуется от соответствующего виджета, и используйте созданный класс для его заполнения.

q1411037_main.py

from PyQt5 import QtCore, QtGui, QtWidgets

from q1411037_signals import NewWindowChoiceMic


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(250, 420)
        MainWindow.setMinimumSize(QtCore.QSize(250, 420))
        MainWindow.setMaximumSize(QtCore.QSize(250, 420))
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 250, 22))
        self.menubar.setObjectName("menubar")
        self.settings = QtWidgets.QMenu(self.menubar)
        self.settings.setObjectName("settings")
        self.microphone_settings = QtWidgets.QMenu(self.settings)
        self.microphone_settings.setObjectName("microphone_settings")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.chose_microphone = QtWidgets.QAction(MainWindow)
        self.chose_microphone.setObjectName("chose_microphone")
        self.microphone_settings.addAction(self.chose_microphone)
        self.settings.addAction(self.microphone_settings.menuAction())
        self.menubar.addAction(self.settings.menuAction())

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle("MainWindow")
        self.settings.setTitle(_translate("MainWindow", 
            "Настройки"))
        self.microphone_settings.setTitle(_translate("MainWindow", 
            "Микрофон"))
        self.chose_microphone.setText(_translate("MainWindow", 
            "Выбор устройства..."))


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        
        self.label = QtWidgets.QLabel(self.centralwidget)   # + для теста
        self.label.setAlignment(QtCore.Qt.AlignCenter)      # + для теста
        layout = QtWidgets.QHBoxLayout(self.centralwidget)  # + для теста
        layout.addWidget(self.label)                        # + для теста
        
        self.newWindowChoiceMic = NewWindowChoiceMic(self)                # !!! +++
        
#        self.add_funk()
#    def add_funk(self):
#        self.chose_microphone.triggered.connect(lambda: signals.choice_micro(True))

        self.chose_microphone.triggered.connect(
            lambda: self.newWindowChoiceMic.choice_micro(True)            # !!! +++
        )
        

if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

q1411037_signals.py

from PyQt5 import QtCore, QtGui, QtWidgets
import speech_recognition as SR

from q1411037_choise import Ui_Choise_mic


class NewWindowChoiceMic(QtWidgets.QWidget, Ui_Choise_mic):
    chosen_mic = ""                                                       # !!! +++

    def __init__(self, parent):                                           # + parent
#        super(NewWindowChoiceMic, self).__init__(parent)
        super(NewWindowChoiceMic, self).__init__()                        # - parent
        
        self.setupUi(self)
        
        self.parent = parent                                              # +++
        
        self.add_funk()
        self.add_funk_btn()
        
# -----------------> vvvv
    def choice_micro(self, signal):                                       # !!!
        if signal:
# --------> vvvv
            self.show()
        else:
# --------> vvvv
            self.hide()        
 
    def add_funk(self):
        list_mic = SR.Microphone().list_microphone_names()
        self.comboBox.addItems(list_mic)
        
#        if self.comboBox.currentTextChanged.connect(lambda: self.text_changed()):
#            self.text_changed()
        self.comboBox.currentTextChanged.connect(self.text_changed)           # !!!

# -----------------------> vvvv
    def text_changed(self, text):
        print(f'{text}') # 
#        global chosen_mic
#        self.chosen_mic = SR.Microphone.list_microphone_names().index(
#            self.comboBox.currentText())
        self.chosen_mic = text

    def add_funk_btn(self):
        self.ok.clicked.connect(self.Ok)
        self.cancel.clicked.connect(self.Cansel)

    def Cansel(self): #!!!
#        signals.choice_micro(False)
# ----> vvvv
        self.choice_micro(False)

    def Ok(self):
        # *часть для сохранения в json файл (удалена за ненадобностью в демонстрации)
#        signals.choice_micro(False)
# ----> vvvv
        self.choice_micro(False) 
        
        self.parent.label.setText(f'{self.comboBox.currentText()}')        # для теста
     

q1411037_choise.py

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Choise_mic(object):
    def setupUi(self, Choise_mic):
        Choise_mic.setObjectName("Choise_mic")
        Choise_mic.resize(500, 70)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, 
            QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            Choise_mic.sizePolicy().hasHeightForWidth())
        Choise_mic.setSizePolicy(sizePolicy)
        Choise_mic.setMinimumSize(QtCore.QSize(500, 70))
        Choise_mic.setMaximumSize(QtCore.QSize(500, 70))
        self.comboBox = QtWidgets.QComboBox(Choise_mic)
        self.comboBox.setGeometry(QtCore.QRect(10, 10, 481, 22))
        self.comboBox.setObjectName("comboBox")
        self.ok = QtWidgets.QPushButton(Choise_mic)
        self.ok.setGeometry(QtCore.QRect(10, 40, 75, 24))
        self.ok.setObjectName("ok")
        self.cancel = QtWidgets.QPushButton(Choise_mic)
        self.cancel.setGeometry(QtCore.QRect(420, 40, 75, 24))
        self.cancel.setObjectName("cancel")

        self.retranslateUi(Choise_mic)
        QtCore.QMetaObject.connectSlotsByName(Choise_mic)

    def retranslateUi(self, Choise_mic):
        _translate = QtCore.QCoreApplication.translate
        Choise_mic.setWindowTitle(_translate("Choise_mic", "Выбор микрофона"))
        self.ok.setText(_translate("Choise_mic", "Ок"))
        self.cancel.setText(_translate("Choise_mic", "Отмена"))

введите сюда описание изображения

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка