PyQt5 работа с классом QAction
Есть меню. В меню находятся действия (первый файл). Нужно сделать так при выборе одного действия в меню (там три их: искать всё; искать телефонные номера; электронные почты и акк) искалось только то что указано в действие (функция поиска находится во втором файле). Буду благодарен
первый файл
from PyQt5 import QtCore
from PyQt5 import QtWidgets
from PyQt5 import QtGui
import window_1
import sys
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, action_search_options_1 = None, action_search_options_2 = None,
action_search_options_3 = None):
QtWidgets.QMainWindow.__init__(self)
# берём из функции create_menuBar QAction для работы с файлом window_1
self.action_search_options_1 = action_search_options_1
self.action_search_options_2 = action_search_options_2
self.action_search_options_3 = action_search_options_3
self.centralWidget = QtWidgets.QWidget() # создаём центральный виджет
self.setCentralWidget(self.centralWidget)
self.mainLayout = QtWidgets.QVBoxLayout(self.centralWidget)
# settings
self.setFixedSize(640, 540)
self.setWindowTitle(" B U G ")
self.setWindowIcon(QtGui.QIcon("bug.ico"))
# делаем сборку
self.widget_main = self.create_page()
self.mainLayout.addWidget(self.widget_main)
self.create_menuBar()
self.create_toolBar()
def create_page(self):
self.widget_page = QtWidgets.QWidget()
# создание обьектов
self.button_1 = QtWidgets.QPushButton("Перейти к поиску телефонных\nномеров и электронных почт")
self.formbox = QtWidgets.QGridLayout()
# добавление в box и в окно
self.formbox.addWidget(self.button_1)
self.formbox.setSpacing(20)
self.widget_page.setLayout(self.formbox)
# датчики и события
self.button_1.clicked.connect(self.clicked_button_1)
# сделать главным комонентом в общем
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_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.action_search_options_1 = QtWidgets.QAction("Искать всё")
self.action_search_options_1.setCheckable(True)
self.action_search_options_1.setChecked(True)
self.action_search_options_2 = QtWidgets.QAction("Телефонные номера")
self.action_search_options_2.setCheckable(True)
self.action_search_options_3 = QtWidgets.QAction("Электронные почты и акк")
self.action_search_options_3.setCheckable(True)
self.group_action_1 = QtWidgets.QActionGroup(self.sub_menu_options_search)
self.group_action_1.addAction(self.action_search_options_1) # добавление в groupbox
self.group_action_1.addAction(self.action_search_options_2)
self.group_action_1.addAction(self.action_search_options_3)
self.sub_menu_options_search.addAction(self.action_search_options_1) # добавление в вложенное
self.sub_menu_options_search.addAction(self.action_search_options_2) # меню
self.sub_menu_options_search.addAction(self.action_search_options_3)
self.sub_menu_options.addMenu(self.sub_menu_options_search) # добавление в меню опции
# добавляем отдельное меню в главное меню
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.action_back = QtWidgets.QAction("Вернуться назад")
self.toolBar.addAction(self.action_back)
self.addToolBar(self.toolBar)
# функции для датчиков
def toggleMenu(self, state):
if state:
self.statusBar().show()
else:
self.statusBar().hide()
def clicked_button_1(self):
widget = self.centralWidget.layout().itemAt(0).widget()
self.centralWidget.layout().removeWidget(widget)
widget.hide()
self.window_1 = window_1.Page_find_numbers()
self.action_back.triggered.connect(self.clicked_action_back)
self.mainLayout.addWidget(self.window_1)
def clicked_action_back(self):
widget = self.centralWidget.layout().itemAt(0).widget()
self.centralWidget.layout().removeWidget(widget)
widget.hide()
self.widget_main = self.create_page()
self.mainLayout.addWidget(self.widget_main)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
MainWindow = MainWindow()
MainWindow.show()
sys.exit(app.exec_())
второй файл
from PyQt5 import QtCore
from PyQt5 import QtWidgets
from PyQt5 import QtGui
import main
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.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.label_2, 2, 0)
self.gridbox.addWidget(self.button_find, 0, 1)
self.gridbox.addWidget(self.button_clear, 1, 1)
self.gridbox.addWidget(self.textedit_1, 1, 0)
self.gridbox.addWidget(self.textedit_2, 4, 0)
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()
# берём для проверки на установленность
self.action_options_1 = main.MainWindow().action_search_options_1
self.action_options_2 = main.MainWindow().action_search_options_2
self.action_options_3 = main.MainWindow().action_search_options_3
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 self.action_options_1.isChecked() == True:
text = "Телефонные номера:\n" + str(telephon_text) + "\n" +"Электронные почты:\n" + str(email_text)
self.textedit_2.setText(text)
if self.action_options_2.isChecked() == True:
text = "Телефонные номера:\n" + str(telephon_text)
self.textedit_2.setText(text)
if self.action_options_3.isChecked() == True:
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("Введите данные!")
# ------ вставить текст в поле для поиска тел и акк ------
# щоашгомошвамшто (+5 555) 555 55 55 апрарdfb 89209103333
# ваииапп 342423 пиа 8 888 888 88-88 dfbdfg [email protected]
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Попробуйте так:
main.py
import sys
from PyQt5 import QtCore, QtWidgets, QtGui
import window_1
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, action_search_options_1 = None, action_search_options_2 = None,
action_search_options_3 = None):
QtWidgets.QMainWindow.__init__(self)
# берём из функции create_menuBar QAction для работы с файлом window_1
self.action_search_options_1 = action_search_options_1
self.action_search_options_2 = action_search_options_2
self.action_search_options_3 = action_search_options_3
self.centralWidget = QtWidgets.QWidget() # создаём центральный виджет
self.setCentralWidget(self.centralWidget)
self.mainLayout = QtWidgets.QVBoxLayout(self.centralWidget)
# settings
self.setFixedSize(640, 540)
self.setWindowTitle(" B U G ")
self.setWindowIcon(QtGui.QIcon("bug.ico"))
# делаем сборку
self.widget_main = self.create_page()
self.mainLayout.addWidget(self.widget_main)
self.create_menuBar()
self.create_toolBar()
def create_page(self):
self.widget_page = QtWidgets.QWidget()
# создание обьектов
self.button_1 = QtWidgets.QPushButton("Перейти к поиску телефонных\nномеров и электронных почт")
self.formbox = QtWidgets.QGridLayout()
# добавление в box и в окно
self.formbox.addWidget(self.button_1)
self.formbox.setSpacing(20)
self.widget_page.setLayout(self.formbox)
# датчики и события
self.button_1.clicked.connect(self.clicked_button_1)
# сделать главным комонентом в общем
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_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.action_search_options_1 = QtWidgets.QAction("Искать всё")
self.action_search_options_1.setCheckable(True)
self.action_search_options_1.setChecked(True)
self.action_search_options_2 = QtWidgets.QAction("Телефонные номера")
self.action_search_options_2.setCheckable(True)
self.action_search_options_3 = QtWidgets.QAction("Электронные почты и акк")
self.action_search_options_3.setCheckable(True)
self.group_action_1 = QtWidgets.QActionGroup(self.sub_menu_options_search)
self.group_action_1.addAction(self.action_search_options_1) # добавление в groupbox
self.group_action_1.addAction(self.action_search_options_2)
self.group_action_1.addAction(self.action_search_options_3)
self.sub_menu_options_search.addAction(self.action_search_options_1) # добавление в вложенное
self.sub_menu_options_search.addAction(self.action_search_options_2) # меню
self.sub_menu_options_search.addAction(self.action_search_options_3)
self.sub_menu_options.addMenu(self.sub_menu_options_search) # добавление в меню опции
# добавляем отдельное меню в главное меню
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.action_back = QtWidgets.QAction("Вернуться назад")
self.toolBar.addAction(self.action_back)
self.addToolBar(self.toolBar)
# функции для датчиков
def toggleMenu(self, state):
if state:
self.statusBar().show()
else:
self.statusBar().hide()
def clicked_button_1(self):
widget = self.centralWidget.layout().itemAt(0).widget()
self.centralWidget.layout().removeWidget(widget)
widget.hide()
self.window_1 = window_1.Page_find_numbers(self) # + self
self.action_back.triggered.connect(self.clicked_action_back)
self.mainLayout.addWidget(self.window_1)
def clicked_action_back(self):
widget = self.centralWidget.layout().itemAt(0).widget()
self.centralWidget.layout().removeWidget(widget)
widget.hide()
self.widget_main = self.create_page()
self.mainLayout.addWidget(self.widget_main)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
MainWindow = MainWindow()
MainWindow.show()
sys.exit(app.exec_())
window_1.py
from PyQt5 import QtCore
from PyQt5 import QtWidgets
from PyQt5 import QtGui
# ? import main
import re
class Page_find_numbers(QtWidgets.QWidget):
def __init__(self, parent = None):
# QtWidgets.QWidget.__init__(self)
super().__init__(parent) # .parent
#print(parent)
self.parent = parent # self.parent
# обьекты
self.button_clear = QtWidgets.QPushButton("Очистить")
self.button_find = QtWidgets.QPushButton("Запустить")
self.label_1 = QtWidgets.QLabel("Вставте сюда текст, в котором хотите\nнайти телефонные номера и электронные\nпочты.")
self.label_2 = QtWidgets.QLabel("Результат:")
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.label_2, 2, 0)
self.gridbox.addWidget(self.button_find, 0, 1)
self.gridbox.addWidget(self.button_clear, 1, 1)
self.gridbox.addWidget(self.textedit_1, 1, 0)
self.gridbox.addWidget(self.textedit_2, 4, 0)
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()
# берём для проверки на установленность
# self.action_options_1 = main.MainWindow().action_search_options_1
# self.action_options_2 = main.MainWindow().action_search_options_2
# self.action_options_3 = main.MainWindow().action_search_options_3
self.action_options_1 = self.parent.action_search_options_1 # self.parent
self.action_options_2 = self.parent.action_search_options_2 # self.parent
self.action_options_3 = self.parent.action_search_options_3 # self.parent
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 self.action_options_1.isChecked() == True:
text = "Телефонные номера:\n" + str(telephon_text) + "\n" +"Электронные почты:\n" + str(email_text)
self.textedit_2.setText(text)
if self.action_options_2.isChecked() == True:
text = "Телефонные номера:\n" + str(telephon_text)
self.textedit_2.setText(text)
if self.action_options_3.isChecked() == True:
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("Введите данные!")
# ------ вставить текст в поле для поиска тел и акк ------
# щоашгомошвамшто (+5 555) 555 55 55 апрарdfb 89209103333
# ваииапп 342423 пиа 8 888 888 88-88 dfbdfg [email protected]
