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", "Отмена"))


