PyQt5 ошибка C/C++ object of type QWidget has been deleted
Ошибка такая "RuntimeError: wrapped C/C++ object of type QWidget has been deleted" удаляет объект.
когда переходим ко второй странице (второй файл) при нажатии на кнопку, но когда нажимаем кнопку на панели задач чтобы обратно вернутся уже на второй странице выдаёт ошибку (выше написанная) как это исправить ? Буду очень благодарен
первый файл
from PyQt5 import QtCore
from PyQt5 import QtWidgets
from PyQt5 import QtGui
import window_1
import sys
class MyMainWindow(QtWidgets.QMainWindow):
def __init__(self):
QtWidgets.QMainWindow.__init__(self)
# settings
self.setFixedSize(640, 520)
self.setWindowTitle(" B U G ")
self.setWindowIcon(QtGui.QIcon("bug.ico"))
# делаем сборку
self.create_page()
self.create_menuBar()
self.create_toolBar()
def create_page(self):
self.widget_page = QtWidgets.QWidget()
# создание обьектов
self.button_1 = QtWidgets.QPushButton("Перейти к поиску телефонных\nномеров и электронных почт")
self.button_exit = QtWidgets.QPushButton("Закрыть")
self.formbox = QtWidgets.QGridLayout()
# добавление в box и в окно
self.formbox.addWidget(self.button_1)
self.formbox.addWidget(self.button_exit)
self.formbox.setSpacing(13)
self.widget_page.setLayout(self.formbox)
# датчики и события
self.button_1.clicked.connect(self.clicked_button_1)
self.button_exit.clicked.connect(app.quit)
# сделать главным комонентом в общем
self.setCentralWidget(self.widget_page)
def create_menuBar(self):
# создание панели-меню и строки состоянии
self.menu = QtWidgets.QMenuBar()
self.status_1 = QtWidgets.QStatusBar()
self.setStatusBar(self.status_1)
self.status_1.showMessage("Добро пожаловать!", msecs = 5000)
# создание категорий и функционал в ней
self.sub_menu_file = QtWidgets.QMenu("Файл")
self.sub_menu_options = QtWidgets.QMenu("Опции")
self.sub_menu_view = QtWidgets.QMenu('Вид')
self.sub_menu_help = QtWidgets.QMenu("Справка")
self.sub_menu_in_options_settings_1 = QtWidgets.QMenu("Настройки")
self.sub_menu_options_search = QtWidgets.QMenu("Настройки поиска")
self.sub_menu_in_options_settings_3 = QtWidgets.QMenu("Настройки генерации")
# настройки строки состояния
self.options_settings_status = QtWidgets.QAction("Включить панель состояния")
self.options_settings_status.setCheckable(True)
self.options_settings_status.setChecked(True)
self.sub_menu_in_options_settings_1.addAction(self.options_settings_status)
self.sub_menu_options.addMenu(self.sub_menu_in_options_settings_1)
# добавляем отдельное меню в главное меню
self.menu.addMenu(self.sub_menu_file)
self.menu.addMenu(self.sub_menu_options)
self.menu.addMenu(self.sub_menu_view)
self.menu.addMenu(self.sub_menu_help)
# датчики
self.options_settings_status.triggered.connect(self.toggleMenu)
# добавляем в окно
self.setMenuBar(self.menu)
def create_toolBar(self):
self.toolBar = QtWidgets.QToolBar("Панель инструментов")
self.toolbutton_1 = QtWidgets.QAction("Назад")
self.toolbutton_1.setEnabled(False)
self.toolBar.addAction(self.toolbutton_1)
self.toolbutton_1.triggered.connect(self.clicked_toolbuuton_1)
# добавляем панель в окно
self.addToolBar(self.toolBar)
# функции для датчиков
def toggleMenu(self, state):
if state:
self.statusBar().show()
else:
self.statusBar().hide()
def clicked_button_1(self):
self.window_1 = window_1.Page_find_numbers()
self.setCentralWidget(self.window_1)
# делаем кнопку на панели активной
self.toolbutton_1.setEnabled(True)
def clicked_toolbuuton_1(self):
self.setCentralWidget(self.widget_page)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
MyMainWindow = MyMainWindow()
MyMainWindow.show()
sys.exit(app.exec_())
второй файл
from PyQt5 import QtCore
from PyQt5 import QtWidgets
from PyQt5 import QtGui
import re
class Page_find_numbers(QtWidgets.QWidget):
def __init__(self, parent = None):
QtWidgets.QWidget.__init__(self)
# обьекты
self.button_clear = QtWidgets.QPushButton("Очистить")
self.button_find = QtWidgets.QPushButton("Запустить")
self.label_1 = QtWidgets.QLabel("Вставте сюда текст, в котором хотите\nнайти телефонные номера и электронные\nпочты.")
self.label_2 = QtWidgets.QLabel("Результат:")
self.label_3 = QtWidgets.QLabel("Документация о <a href = 'https://ru.wikipedia.org/wiki/Python' alink = '#d0fff7'>Python</a>")
self.label_3.setOpenExternalLinks(True)
self.textedit_1 = QtWidgets.QTextEdit()
self.textedit_2 = QtWidgets.QTextEdit()
self.textedit_2.setTextInteractionFlags(QtCore.Qt.TextBrowserInteraction)
self.gridbox = QtWidgets.QGridLayout()
# добавление в box
self.gridbox.addWidget(self.label_1,0 , 0)
self.gridbox.addWidget(self.textedit_1, 1, 0)
self.gridbox.addWidget(self.label_2,2 , 0)
self.gridbox.addWidget(self.textedit_2, 3, 0)
self.gridbox.addWidget(self.label_3, 3 ,1)
self.gridbox.addWidget(self.button_find, 0 ,1)
self.gridbox.addWidget(self.button_clear, 1, 1)
self.gridbox.setVerticalSpacing(18)
self.setLayout(self.gridbox)
# датчики событий
self.button_clear.clicked.connect(self.textedit_1.clear)
self.button_clear.clicked.connect(self.textedit_2.clear)
self.button_find.clicked.connect(self.to_seek_nomer_email)
def to_seek_nomer_email(self):
PlainText = self.textedit_1.toPlainText()
if len(PlainText) > 0:
# шаблон для телефонных номеров
inserted_text_1 = re.compile(r'\W?\D?\d\s?\d\d\d\D?\s?\d\d\d\s?-?\d\d\s?-?\d\d')
# шаблон для акк и электронных почт
email_akk = re.compile(r'[a-zA-Z0-9]{1,50}@[a-z]{2,6}\.[a-z]{2,4}')
# собирает данные
email_text = email_akk.findall(PlainText)
telephon_text = inserted_text_1.findall(PlainText)
# если в массиве оказались телефонные номера или акк и почты
if len(email_text) > 0 or len(telephon_text) > 0:
# проверка сразу на акк и телефонов
if len(email_text) > 0 and len(telephon_text) > 0:
text_1 = str(telephon_text)
text_2 = str(email_text)
text = "Телефонные номера:\n" + text_1 + "\n" +"Электронные почты:\n" + text_2
self.textedit_2.setText(text)
# проверка есть ли телефонные номера
elif len(telephon_text) > 0:
text = "Телефонные номера:\n" + str(telephon_text)
self.textedit_2.setText(text)
# проверка есть ли акк или почта
elif len(email_text) > 0:
text = "Электронные почты:\n" + str(email_text)
self.textedit_2.setText(text)
# если в списке нет номеров
elif len(email_text) == 0 and len(telephon_text) == 0:
self.textedit_2.setText("Данных не обнаружено")
elif len(PlainText) == 0:
self.textedit_2.setText("Введите данные!")
Ответы (1 шт):
Так не получится. Создайте кнопку "Назад" на второй странице. После создания экземпляра self.window_1 = window_1.Page_find_numbers(), привяжите событие нажатия этой кнопки к нужному вам слоту, в котором делайте что вам надо. Я отметил строки, в которые внес изменения, так - # +++
main.py
import sys
from PyQt5 import QtCore
from PyQt5 import QtWidgets
from PyQt5 import QtGui
import window_1
class MyMainWindow(QtWidgets.QMainWindow):
def __init__(self):
QtWidgets.QMainWindow.__init__(self)
# settings
self.setFixedSize(640, 520)
self.setWindowTitle(" B U G ")
self.setWindowIcon(QtGui.QIcon("bug.ico"))
# делаем сборку
self.create_page()
self.create_menuBar()
self.create_toolBar()
def create_page(self):
self.widget_page = QtWidgets.QWidget()
# создание обьектов
self.button_1 = QtWidgets.QPushButton("Перейти к поиску телефонных\nномеров и электронных почт")
self.button_exit = QtWidgets.QPushButton("Закрыть")
self.formbox = QtWidgets.QGridLayout()
# добавление в box и в окно
self.formbox.addWidget(self.button_1)
self.formbox.addWidget(self.button_exit)
self.formbox.setSpacing(13)
self.widget_page.setLayout(self.formbox)
# датчики и события
self.button_1.clicked.connect(self.clicked_button_1)
self.button_exit.clicked.connect(app.quit)
# сделать главным комонентом в общем
self.setCentralWidget(self.widget_page)
def create_menuBar(self):
# создание панели-меню и строки состоянии
self.menu = QtWidgets.QMenuBar()
self.status_1 = QtWidgets.QStatusBar()
self.setStatusBar(self.status_1)
self.status_1.showMessage("Добро пожаловать!", msecs = 5000)
# создание категорий и функционал в ней
self.sub_menu_file = QtWidgets.QMenu("Файл")
self.sub_menu_options = QtWidgets.QMenu("Опции")
self.sub_menu_view = QtWidgets.QMenu('Вид')
self.sub_menu_help = QtWidgets.QMenu("Справка")
self.sub_menu_in_options_settings_1 = QtWidgets.QMenu("Настройки")
self.sub_menu_options_search = QtWidgets.QMenu("Настройки поиска")
self.sub_menu_in_options_settings_3 = QtWidgets.QMenu("Настройки генерации")
# настройки строки состояния
self.options_settings_status = QtWidgets.QAction("Включить панель состояния")
self.options_settings_status.setCheckable(True)
self.options_settings_status.setChecked(True)
self.sub_menu_in_options_settings_1.addAction(self.options_settings_status)
self.sub_menu_options.addMenu(self.sub_menu_in_options_settings_1)
# добавляем отдельное меню в главное меню
self.menu.addMenu(self.sub_menu_file)
self.menu.addMenu(self.sub_menu_options)
self.menu.addMenu(self.sub_menu_view)
self.menu.addMenu(self.sub_menu_help)
# датчики
self.options_settings_status.triggered.connect(self.toggleMenu)
# добавляем в окно
self.setMenuBar(self.menu)
def create_toolBar(self):
self.toolBar = QtWidgets.QToolBar("Панель инструментов")
self.toolbutton_1 = QtWidgets.QAction("Назад")
self.toolbutton_1.setEnabled(False)
self.toolBar.addAction(self.toolbutton_1)
#? self.toolbutton_1.triggered.connect(self.clicked_toolbuuton_1)
# добавляем панель в окно
self.addToolBar(self.toolBar)
# функции для датчиков
def toggleMenu(self, state):
if state:
self.statusBar().show()
else:
self.statusBar().hide()
def clicked_button_1(self):
self.window_1 = window_1.Page_find_numbers()
self.window_1.button_back.clicked.connect(self.clicked_toolbuuton_1) # +++
# self.setCentralWidget(self.window_1)
self.window_1.show() # +++
self.hide() # +++
# делаем кнопку на панели активной
self.toolbutton_1.setEnabled(True)
def clicked_toolbuuton_1(self):
# self.setCentralWidget(self.widget_page)
self.show() # +++
self.window_1.hide() # +++
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
MyMainWindow = MyMainWindow()
MyMainWindow.show()
sys.exit(app.exec_())
window_1.py
from PyQt5 import QtCore
from PyQt5 import QtWidgets
from PyQt5 import QtGui
import re
class Page_find_numbers(QtWidgets.QWidget):
def __init__(self, parent = None):
QtWidgets.QWidget.__init__(self)
self.resize(640, 520)
# обьекты
self.button_back = QtWidgets.QPushButton("Назад") # +++
self.button_clear = QtWidgets.QPushButton("Очистить")
self.button_find = QtWidgets.QPushButton("Запустить")
self.label_1 = QtWidgets.QLabel("Вставте сюда текст, в котором хотите\nнайти телефонные номера и электронные\nпочты.")
self.label_2 = QtWidgets.QLabel("Результат:")
self.label_3 = QtWidgets.QLabel("Документация о <a href = 'https://ru.wikipedia.org/wiki/Python' alink = '#d0fff7'>Python</a>")
self.label_3.setOpenExternalLinks(True)
self.textedit_1 = QtWidgets.QTextEdit()
self.textedit_2 = QtWidgets.QTextEdit()
self.textedit_2.setTextInteractionFlags(QtCore.Qt.TextBrowserInteraction)
self.gridbox = QtWidgets.QGridLayout()
# добавление в box button_back
self.gridbox.addWidget(self.button_back, 0, 0, alignment=QtCore.Qt.AlignLeft) # +++
self.gridbox.addWidget(self.label_1, 1, 0)
self.gridbox.addWidget(self.button_find, 1, 1)
self.gridbox.addWidget(self.textedit_1, 2, 0)
self.gridbox.addWidget(self.button_clear,2, 1)
self.gridbox.addWidget(self.label_2, 3, 0)
self.gridbox.addWidget(self.textedit_2, 4, 0)
self.gridbox.addWidget(self.label_3, 4 ,1)
# self.gridbox.addWidget(self.button_find, 0 ,1)
# self.gridbox.addWidget(self.button_clear, 1, 1)
self.gridbox.setVerticalSpacing(18)
self.setLayout(self.gridbox)
# датчики событий
self.button_clear.clicked.connect(self.textedit_1.clear)
self.button_clear.clicked.connect(self.textedit_2.clear)
self.button_find.clicked.connect(self.to_seek_nomer_email)
def to_seek_nomer_email(self):
PlainText = self.textedit_1.toPlainText()
if len(PlainText) > 0:
# шаблон для телефонных номеров
inserted_text_1 = re.compile(r'\W?\D?\d\s?\d\d\d\D?\s?\d\d\d\s?-?\d\d\s?-?\d\d')
# шаблон для акк и электронных почт
email_akk = re.compile(r'[a-zA-Z0-9]{1,50}@[a-z]{2,6}\.[a-z]{2,4}')
# собирает данные
email_text = email_akk.findall(PlainText)
telephon_text = inserted_text_1.findall(PlainText)
# если в массиве оказались телефонные номера или акк и почты
if len(email_text) > 0 or len(telephon_text) > 0:
# проверка сразу на акк и телефонов
if len(email_text) > 0 and len(telephon_text) > 0:
text_1 = str(telephon_text)
text_2 = str(email_text)
text = "Телефонные номера:\n" + text_1 + "\n" +"Электронные почты:\n" + text_2
self.textedit_2.setText(text)
# проверка есть ли телефонные номера
elif len(telephon_text) > 0:
text = "Телефонные номера:\n" + str(telephon_text)
self.textedit_2.setText(text)
# проверка есть ли акк или почта
elif len(email_text) > 0:
text = "Электронные почты:\n" + str(email_text)
self.textedit_2.setText(text)
# если в списке нет номеров
elif len(email_text) == 0 and len(telephon_text) == 0:
self.textedit_2.setText("Данных не обнаружено")
elif len(PlainText) == 0:
self.textedit_2.setText("Введите данные!")
Update
Если хотите чтобы данные, которые набирались во втором окне - сохранялись при следующем входе, перенесите self.window_1 = window_1.Page_find_numbers() # +++ <<< в конструктор класса MyMainWindow.
main.py
import sys
from PyQt5 import QtCore
from PyQt5 import QtWidgets
from PyQt5 import QtGui
import window_1
class MyMainWindow(QtWidgets.QMainWindow):
def __init__(self):
QtWidgets.QMainWindow.__init__(self)
# settings
self.setFixedSize(640, 520)
self.setWindowTitle(" B U G ")
self.setWindowIcon(QtGui.QIcon("bug.ico"))
# делаем сборку
self.create_page()
self.create_menuBar()
self.create_toolBar()
self.window_1 = window_1.Page_find_numbers() # +++ <<<
def create_page(self):
self.widget_page = QtWidgets.QWidget()
# создание обьектов
self.button_1 = QtWidgets.QPushButton("Перейти к поиску телефонных\nномеров и электронных почт")
self.button_exit = QtWidgets.QPushButton("Закрыть")
self.formbox = QtWidgets.QGridLayout()
# добавление в box и в окно
self.formbox.addWidget(self.button_1)
self.formbox.addWidget(self.button_exit)
self.formbox.setSpacing(13)
self.widget_page.setLayout(self.formbox)
# датчики и события
self.button_1.clicked.connect(self.clicked_button_1)
self.button_exit.clicked.connect(app.quit)
# сделать главным комонентом в общем
self.setCentralWidget(self.widget_page)
def create_menuBar(self):
# создание панели-меню и строки состоянии
self.menu = QtWidgets.QMenuBar()
self.status_1 = QtWidgets.QStatusBar()
self.setStatusBar(self.status_1)
self.status_1.showMessage("Добро пожаловать!", msecs = 5000)
# создание категорий и функционал в ней
self.sub_menu_file = QtWidgets.QMenu("Файл")
self.sub_menu_options = QtWidgets.QMenu("Опции")
self.sub_menu_view = QtWidgets.QMenu('Вид')
self.sub_menu_help = QtWidgets.QMenu("Справка")
self.sub_menu_in_options_settings_1 = QtWidgets.QMenu("Настройки")
self.sub_menu_options_search = QtWidgets.QMenu("Настройки поиска")
self.sub_menu_in_options_settings_3 = QtWidgets.QMenu("Настройки генерации")
# настройки строки состояния
self.options_settings_status = QtWidgets.QAction("Включить панель состояния")
self.options_settings_status.setCheckable(True)
self.options_settings_status.setChecked(True)
self.sub_menu_in_options_settings_1.addAction(self.options_settings_status)
self.sub_menu_options.addMenu(self.sub_menu_in_options_settings_1)
# добавляем отдельное меню в главное меню
self.menu.addMenu(self.sub_menu_file)
self.menu.addMenu(self.sub_menu_options)
self.menu.addMenu(self.sub_menu_view)
self.menu.addMenu(self.sub_menu_help)
# датчики
self.options_settings_status.triggered.connect(self.toggleMenu)
# добавляем в окно
self.setMenuBar(self.menu)
def create_toolBar(self):
self.toolBar = QtWidgets.QToolBar("Панель инструментов")
self.toolbutton_1 = QtWidgets.QAction("Назад")
self.toolbutton_1.setEnabled(False)
self.toolBar.addAction(self.toolbutton_1)
#? self.toolbutton_1.triggered.connect(self.clicked_toolbuuton_1)
# добавляем панель в окно
self.addToolBar(self.toolBar)
# функции для датчиков
def toggleMenu(self, state):
if state:
self.statusBar().show()
else:
self.statusBar().hide()
def clicked_button_1(self):
# >>> self.window_1 = window_1.Page_find_numbers() # >>>
self.window_1.button_back.clicked.connect(self.clicked_toolbuuton_1) # +++
# self.setCentralWidget(self.window_1)
self.window_1.show() # +++
self.hide() # +++
# делаем кнопку на панели активной
self.toolbutton_1.setEnabled(True)
def clicked_toolbuuton_1(self):
# self.setCentralWidget(self.widget_page)
self.show() # +++
self.window_1.hide() # +++
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
MyMainWindow = MyMainWindow()
MyMainWindow.show()
sys.exit(app.exec_())
Update 2
Попробуйте так:
import sys
from PyQt5 import QtCore
from PyQt5 import QtWidgets
from PyQt5 import QtGui
import window_1
class MyMainWindow(QtWidgets.QMainWindow):
def __init__(self):
QtWidgets.QMainWindow.__init__(self)
self.centralWidget = QtWidgets.QWidget() # +++
self.setCentralWidget(self.centralWidget) # +++
self.mainLayout = QtWidgets.QVBoxLayout(self.centralWidget) # +++
# settings
self.setFixedSize(640, 520)
self.setWindowTitle(" B U G ")
self.setWindowIcon(QtGui.QIcon("bug.ico"))
# делаем сборку
self.widget_main = self.create_page() # +++
self.create_menuBar()
self.create_toolBar()
self.mainLayout.addWidget(self.widget_main) # +++
def create_page(self):
self.widget_page = QtWidgets.QWidget()
# создание обьектов
self.button_1 = QtWidgets.QPushButton("Перейти к поиску телефонных\nномеров и электронных почт")
self.button_exit = QtWidgets.QPushButton("Закрыть")
self.formbox = QtWidgets.QGridLayout()
# добавление в box и в окно
self.formbox.addWidget(self.button_1)
self.formbox.addWidget(self.button_exit)
self.formbox.setSpacing(13)
self.widget_page.setLayout(self.formbox)
# датчики и события
self.button_1.clicked.connect(self.clicked_button_1)
self.button_exit.clicked.connect(app.quit)
# сделать главным комонентом в общем
# self.setCentralWidget(self.widget_page)
return self.widget_page # +++
def create_menuBar(self):
# создание панели-меню и строки состоянии
self.menu = QtWidgets.QMenuBar()
self.status_1 = QtWidgets.QStatusBar()
self.setStatusBar(self.status_1)
self.status_1.showMessage("Добро пожаловать!", msecs = 5000)
# создание категорий и функционал в ней
self.sub_menu_file = QtWidgets.QMenu("Файл")
self.sub_menu_options = QtWidgets.QMenu("Опции")
self.sub_menu_view = QtWidgets.QMenu('Вид')
self.sub_menu_help = QtWidgets.QMenu("Справка")
self.sub_menu_in_options_settings_1 = QtWidgets.QMenu("Настройки")
self.sub_menu_options_search = QtWidgets.QMenu("Настройки поиска")
self.sub_menu_in_options_settings_3 = QtWidgets.QMenu("Настройки генерации")
# настройки строки состояния
self.options_settings_status = QtWidgets.QAction("Включить панель состояния")
self.options_settings_status.setCheckable(True)
self.options_settings_status.setChecked(True)
self.sub_menu_in_options_settings_1.addAction(self.options_settings_status)
self.sub_menu_options.addMenu(self.sub_menu_in_options_settings_1)
# добавляем отдельное меню в главное меню
self.menu.addMenu(self.sub_menu_file)
self.menu.addMenu(self.sub_menu_options)
self.menu.addMenu(self.sub_menu_view)
self.menu.addMenu(self.sub_menu_help)
# датчики
self.options_settings_status.triggered.connect(self.toggleMenu)
# добавляем в окно
self.setMenuBar(self.menu)
def create_toolBar(self):
self.toolBar = QtWidgets.QToolBar("Панель инструментов")
self.toolbutton_1 = QtWidgets.QAction("Назад")
self.toolbutton_1.setEnabled(False)
self.toolBar.addAction(self.toolbutton_1)
#? self.toolbutton_1.triggered.connect(self.clicked_toolbuuton_1)
# добавляем панель в окно
self.addToolBar(self.toolBar)
# функции для датчиков
def toggleMenu(self, state):
if state:
self.statusBar().show()
else:
self.statusBar().hide()
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
def clicked_button_1(self):
w = self.centralWidget.layout().itemAt(0).widget()
self.centralWidget.layout().removeWidget(w)
w.hide()
self.window_1 = window_1.Page_find_numbers()
self.window_1.button_back.clicked.connect(self.clicked_toolbuuton_1)
self.mainLayout.addWidget(self.window_1)
# делаем кнопку на панели активной
self.toolbutton_1.setEnabled(True)
def clicked_toolbuuton_1(self):
w = self.centralWidget.layout().itemAt(0).widget()
self.centralWidget.layout().removeWidget(w)
w.hide()
self.widget_main = self.create_page()
self.mainLayout.addWidget(self.widget_main)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
MyMainWindow = MyMainWindow()
MyMainWindow.show()
sys.exit(app.exec_())


