Сохранение языка интерфейса при выходе из приложения
Проблема такая - когда нажимаю на англ язык (действие в меню) весь интерфейс переходит в англ язык, когда выхожу и снова захожу (я использую файлы конфигурации для сохранение настроек, которые выбрал пользователь) то весь интерфейс опять на русском хотя в меню выбран пункт англ язык, когда нажимаю снова на этот пункт то всё становится опять англ.
Как реализовать что при выходе и заходе в приложения язык интерфейса оставался таким же каким выбран в пункте в меню. Буду очень благодарен.
main.py
from PyQt5 import QtCore
from PyQt5 import QtGui
from PyQt5 import QtWidgets
from PyQt5.QtCore import QTranslator, QEvent
from PyQt5.QtWidgets import QApplication
from options import Settings
import window_1
import sys
import ctypes
import os
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
QtWidgets.QMainWindow.__init__(self)
# создание файла для сохранения натроек
if os.name == "nt": # проверка на название системы
self.CONFIG_FILE_NAME = 'settings\\config.ini'
self.centralWidget = QtWidgets.QWidget() # создаём центральный виджет
self.setCentralWidget(self.centralWidget)
self.window_1 = window_1.Page_find_numbers(self)
self.trans = QTranslator(self)
self.mainLayout = QtWidgets.QVBoxLayout(self.centralWidget)
# settings
self.setFixedSize(640, 600)
self.setWindowTitle(" B U G ")
self.setWindowIcon(QtGui.QIcon("settings\\bug.ico"))
# делаем сборку
self.widget_main = self.create_page()
self.mainLayout.addWidget(self.widget_main)
self.create_menuBar()
self.create_toolBar()
# класс для сохранения настроек
Settings.load_settings(self)
# для строки состоянии
self.label_1 = QtWidgets.QLabel("v 1.0")
self.label_1.setStyleSheet("font-size: 18px; color: black;")
self.status_1.addPermanentWidget(self.label_1)
self.status_1.showMessage("Добро пожаловать!", msecs = 4000)
self.setStatusBar(self.status_1)
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.menu_options = QtWidgets.QMenu("Опции")
self.menu_view = QtWidgets.QMenu('Вид')
self.menu_help = QtWidgets.QMenu("Справка")
self.sub_menu_in_options_settings_1 = 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.menu_options.addMenu(self.sub_menu_in_options_settings_1)
# настройки поиска
self.sub_menu_options_search = QtWidgets.QMenu("Настройки поиска")
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.menu_options.addMenu(self.sub_menu_options_search) # добавление в меню опции
# настройка языка
self.delimiter_2 = QtWidgets.QAction()
self.delimiter_2.setSeparator(True)
self.menu_options.addAction(self.delimiter_2)
self.language_menu = QtWidgets.QMenu("Язык")
self.language_russian = QtWidgets.QAction("Русcкий (ru)")
self.language_russian.setCheckable(True)
self.language_russian.setChecked(True)
self.language_english = QtWidgets.QAction("English (en)")
self.language_english.setCheckable(True)
self.group_action_6 = QtWidgets.QActionGroup(self.language_menu)
self.group_action_6.addAction(self.language_english)
self.group_action_6.addAction(self.language_russian)
# датчик если будет изменения внутри ++++
self.group_action_6.triggered.connect(self.clicked_language)
self.language_menu.addAction(self.language_english)
self.language_menu.addAction(self.language_russian)
self.menu_options.addMenu(self.language_menu)
# настройка тем
self.sub_menu_view_themes = QtWidgets.QMenu("Цветовая схема")
self.view_theme_1 = QtWidgets.QAction("Тёмно-синяя тема")
self.view_theme_1.setCheckable(True)
self.view_theme_2 = QtWidgets.QAction("Светло-серая тема")
self.view_theme_2.setCheckable(True)
self.view_theme_2.setChecked(True)
self.view_theme_3 = QtWidgets.QAction("Тёмно-коричневая тема")
self.view_theme_3.setCheckable(True)
self.group_action_5 = QtWidgets.QActionGroup(self.sub_menu_view_themes)
self.group_action_5.addAction(self.view_theme_1)
self.group_action_5.addAction(self.view_theme_2)
self.group_action_5.addAction(self.view_theme_3)
self.sub_menu_view_themes.addAction(self.view_theme_1)
self.sub_menu_view_themes.addAction(self.view_theme_2)
self.sub_menu_view_themes.addAction(self.view_theme_3)
self.menu_view.addMenu(self.sub_menu_view_themes)
# добавляем отдельное меню в главное меню
self.menu.addMenu(self.menu_options)
self.menu.addMenu(self.menu_view)
self.menu.addMenu(self.menu_help)
# датчики
self.options_settings_status.triggered.connect(self.toggleMenu)
# добавляем в окно
self.setMenuBar(self.menu)
def clicked_language(self, lang):
if lang.text() == "English (en)":
self.trans.load('ru-eng')
_app = QApplication.instance()
_app.installTranslator(self.trans)
else:
_app = QApplication.instance()
_app.removeTranslator(self.trans)
def retranslateUi(self): # перевод на другой язык
self.button_1.setText(QApplication.translate('MainWindow', 'Перейти к поиску телефонных\nномеров и электронных почт'))
self.window_1.button_clear.setText(QApplication.translate('MainWindow', 'Очистить'))
self.window_1.button_find.setText(QApplication.translate('MainWindow', 'Запустить'))
self.window_1.button_save.setText(QApplication.translate('MainWindow', 'Сохранить\nв txt-файл'))
self.window_1.label_1.setText(QApplication.translate('MainWindow', 'Вставте сюда текст, в котором хотите\nнайти телефонные номера и электронные\nпочты.'))
self.window_1.label_2.setText(QApplication.translate('MainWindow', 'Результат:'))
self.action_back.setText(QApplication.translate('MainWindow', 'Вернуться назад')) # на ToolBar
self.menu_options.setTitle(QApplication.translate('MainWindow', 'Опции'))
self.menu_view.setTitle(QApplication.translate('MainWindow', 'Вид'))
self.menu_help.setTitle(QApplication.translate('MainWindow', 'Справка'))
self.sub_menu_in_options_settings_1.setTitle(QApplication.translate('MainWindow', "настройки"))
self.options_settings_status.setText(QApplication.translate('MainWindow', "Включить панель состояния"))
self.sub_menu_options_search.setTitle(QApplication.translate("MainWindow", "Настройки поиска"))
self.action_search_options_1.setText(QApplication.translate('MainWindow', "Искать всё"))
self.action_search_options_2.setText(QApplication.translate('MainWindow', "Телефонные номера"))
self.action_search_options_3.setText(QApplication.translate('MainWindow', "Электронные почты и акк"))
def changeEvent(self, event):
if event.type() == QEvent.LanguageChange:
self.retranslateUi()
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.show()
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 self.language_english.isChecked():
self.language_english.trigger()
else:
self.language_russian.trigger()
# для сохранения настроек при выходе из приложения
def closeEvent(self, event):
Settings.save_settings(self)
super().closeEvent(event)
if __name__ == '__main__':
myappid = 'mycompany.myproduct.subproduct.version'
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid)
app = QtWidgets.QApplication(sys.argv)
app.setWindowIcon(QtGui.QIcon("settings\\bug.ico"))
MainWindow = MainWindow()
MainWindow.show()
sys.exit(app.exec_())
window_1.py
from PyQt5 import QtCore
from PyQt5 import QtWidgets
import os
import re
class Page_find_numbers(QtWidgets.QWidget):
def __init__(self, parent = None):
super().__init__(parent)
self.parent = parent
# списки для хранения найденных данных в тексте
self.email_text = []
self.telephon_text = []
# обьекты
self.button_clear = QtWidgets.QPushButton("Очистить")
self.button_find = QtWidgets.QPushButton("Запустить")
self.button_save = QtWidgets.QPushButton("Сохранить\nв txt-файл")
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.button_save, 4, 1, alignment = QtCore.Qt.AlignTop)
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.toSeekNomerEmail)
self.button_save.clicked.connect(self.toSaveNomerEmail)
def toSeekNomerEmail(self):
PlainText = self.textedit_1.toPlainText()
self.action_options_1 = self.parent.action_search_options_1
self.action_options_2 = self.parent.action_search_options_2
self.action_options_3 = self.parent.action_search_options_3
self.status_1 = self.parent.status_1
self.options_settings_status = self.parent.options_settings_status
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}')
# собирает данные
self.email_text = email_akk.findall(PlainText)
self.telephon_text = inserted_text_1.findall(PlainText)
# если в массиве оказались телефонные номера или акк и почты
if len(self.email_text) > 0 or len(self.telephon_text) > 0:
# проверка на установленный режим действия
# искать всё (действие)
if self.action_options_1.isChecked() == True:
text_1 = '' # для телефонных номеов
text_2 = '' # для почт и аккаунтов
# преобразовать в нормальные вид
for nomer in self.telephon_text:
text_1 += nomer + "\n"
for email in self.email_text:
text_2 += email + "\n"
# проверка на то что будет выводится в тексте
# только телефонные номера
if len(text_1) > 0 and len(text_2) == 0:
self.textedit_2.setText("Телефонные номера:\n" + text_1)
# только почты
elif len(text_1) == 0 and len(text_2) > 0:
self.textedit_2.setText("Электронные почты:\n" + text_2)
# всё вместе
elif len(text_1) > 0 and len(text_2) > 0:
self.textedit_2.setText("Телефонные номера:\n" + text_1\
+ "\nЭлектронные почты:\n" + text_2)
# панель состояние
self.status_1.showMessage("Телефонные номера - " + str(len(self.telephon_text))\
+ "; Электронные почты - " + str(len(self.email_text)), msecs = 3500)
# искать телефонные номера
elif self.action_options_2.isChecked() == True:
text_1 = ''
for nomer in self.telephon_text:
text_1 += nomer + "\n"
# если оказались данные
if len(text_1) > 0:
self.textedit_2.setText("Телефонные номера:\n" + text_1)
elif len(text_1) == 0:
self.textedit_2.setText("Данных не обнаружено!")
# панель состояния
self.status_1.showMessage("Найдено: телефонные номера - " + str(len(self.telephon_text)), msecs = 3500)
# искать аккаунты и почты
elif self.action_options_3.isChecked() == True:
text_2 = ''
for email in self.email_text:
text_2 += email + "\n"
# если оказались данные
if len(text_2) > 0:
self.textedit_2.setText("Электронные почты:\n" + text_2)
elif len(text_2) == 0:
self.textedit_2.setText("Данных не обнаружено!")
# панель состояния
self.status_1.showMessage("Найдено: электронные почты и акк - " + str(len(self.email_text)), msecs = 3500)
# если в списке нет номеров
elif len(self.email_text) == 0 and len(self.telephon_text) == 0:
self.textedit_2.setText("Данных не обнаружено!")
# если в первом тексте не обнаруженно данных для поиска
elif len(PlainText) == 0:
self.textedit_2.setText("Введите данные!")
def toSaveNomerEmail(self):
if len(self.email_text) > 0 or len(self.telephon_text) > 0:
# проверка на путь
if os.path.exists("C:/nomera_email") == False:
# созданте папки
os.mkdir('C:/nomera_email')
# проверка на установленность действия
# поиск всего
if self.action_options_1.isChecked() == True:
telephon_nomer_email = open('C:/nomera_email/Telephonnue_nomera_email.txt', 'w')
# записывается номера и акк, и почты
if len(self.telephon_text) > 0: # проверка на номера
telephon_nomer_email.write("Телефонные номера:\n")
for tel_nomer in self.telephon_text:
telephon_nomer_email.write(tel_nomer + "\n")
telephon_nomer_email.write("")
if len(self.email_text) > 0: # проверка на акк или почта
telephon_nomer_email.write("\nАккаунты, электронные почты:\n")
for email in self.email_text:
telephon_nomer_email.write(email + '\n')
telephon_nomer_email.write("")
telephon_nomer_email.close()
# если устновлено поиск телефонных номеров
elif self.action_options_2.isChecked() == True:
# запись телефонный номеров
if len(self.telephon_text) > 0:
telephon_nomer = open('C:/nomera_email/Telephonnue_nomera.txt', 'w')
telephon_nomer.write("Телефонные номера:\n")
for tel_nomer in self.telephon_text:
telephon_nomer.write(tel_nomer + "\n")
telephon_nomer.write("")
telephon_nomer.close()
# поиск почт и аккаунтов
elif self.action_options_3.isChecked() == True:
# запись аккаунтов
if len(self.email_text) > 0:
email_file = open('C:/nomera_email/Email.txt', 'w')
email_file.write("\nАккаунты, электронные почты:\n")
for email in self.email_text:
email_file.write(email + '\n')
email_file.write("")
email_file.close()
# если путь существует
elif os.path.exists("C:/nomera_email") == True:
# проверка на устновленность режима поиска
if self.action_options_1.isChecked() == True:
telephon_nomer_email = open('C:/nomera_email/Telephonnue_nomera_email.txt', 'a')
# запись номеров
if len(self.telephon_text) > 0:
telephon_nomer_email.write("\nТелефонные номера:\n")
for tel_nomer_1 in self.telephon_text:
telephon_nomer_email.write(tel_nomer_1 + "\n")
telephon_nomer_email.write("")
# запись аккаунтов
if len(self.email_text) > 0:
telephon_nomer_email.write("\nАккаунты и електронные почты:\n")
for email_1 in self.email_text:
telephon_nomer_email.write(email_1 + '\n')
telephon_nomer_email.write("")
telephon_nomer_email.close()
elif self.action_options_2.isChecked() == True:
if len(self.telephon_text) > 0:
telephon_nomer = open('C:/nomera_email/Telephonnue_nomera.txt', 'a')
telephon_nomer.write("\nТелефонные номера:\n")
for tel_nomer_1 in self.telephon_text:
telephon_nomer.write(tel_nomer_1 + "\n")
telephon_nomer.write("")
telephon_nomer.close()
elif self.action_options_3.isChecked() == True:
if len(self.email_text) > 0:
email_file = open('C:/nomera_email/Email.txt', 'a')
email_file.write("\nАккаунты и электронные почты:\n")
for email_1 in self.email_text:
email_file.write(email_1 + '\n')
email_file.write("")
email_file.close()
# вывод информации после сохранения
self.textedit_2.setText("Вы сохранили в txt-файл,\nна путь - C:\\nomera_email")
# если данных для сохранения не обнаружено
elif len(self.email_text) == 0 and len(self.telephon_text) == 0:
self.textedit_2.setText("Данных для сохранения в\ntxt-файл не обнаружено!")
# номера и акк для проверки поиска
# щоашгомошвамшто (+5 555) 555 55 55 апрарdfb 89209103333
# ваииапп 342423 пиа 8 888 888 88-88 dfbdfg [email protected]
options.py
from PyQt5.Qt import QSettings
from PyQt5 import QtWidgets
from PyQt5 import QtGui
class Settings(QtWidgets.QWidget):
def __init__(self, parent = None):
super().__init__(parent)
self.parent = parent
# берём нужные действия для поиска
self.action_search_options_1 = self.parent.action_search_options_1
self.action_search_options_2 = self.parent.action_search_options_2
self.action_search_options_3 = self.parent.action_search_options_3
# для строки состояния
self.status_1 = self.parent.status_1
# настройка для генерации ключей
self.action_generator_combination_1 = self.parent.action_generator_combination_1
self.action_generator_combination_2 = self.parent.action_generator_combination_2
self.action_generator_combination_3 = self.parent.action_generator_combination_3
self.action_generator_combination_4 = self.parent.action_generator_combination_4
self.settings_generator_length_1 = self.parent.settings_generator_length_1
self.settings_generator_length_2 = self.parent.settings_generator_length_2
self.settings_generator_length_3 = self.parent.settings_generator_length_3
self.settings_generator_register_1 = self.parent.settings_generator_register_1
self.settings_generator_register_2 = self.parent.settings_generator_register_2
self.settings_generator_register_3 = self.parent.settings_generator_register_3
# настройка для языка
self.language_russian = self.parent.language_russian
self.language_english = self.parent.language_english
# настройка для тем
self.view_theme_1 = self.parent.view_theme_1
self.view_theme_2 = self.parent.view_theme_2
# настройка для строки состояния
self.options_settings_status = self.parent.options_settings_status
def load_settings(self):
settings = QSettings(self.CONFIG_FILE_NAME, QSettings.IniFormat)
# для поиска
self.action_search_options_1.setChecked(bool(int(settings.value('BoolValue_search_1', 1))))
self.action_search_options_2.setChecked(bool(int(settings.value('BoolValue_search_2', 0))))
self.action_search_options_3.setChecked(bool(int(settings.value('BoolValue_search_3', 0))))
# настройка языка
self.language_russian.setChecked(bool(int(settings.value('BoolValue_language_russian', 1))))
self.language_english.setChecked(bool(int(settings.value('BoolValue_language_english', 0))))
# для тем
self.view_theme_1.setChecked(bool(int(settings.value('BoolValue_theme_1', 0))))
self.view_theme_2.setChecked(bool(int(settings.value('BoolValue_theme_2', 1))))
# настройка для строки состояния
self.options_settings_status.setChecked(bool(int(settings.value('BoolValue_statusBar', 1))))
def save_settings(self):
settings = QSettings(self.CONFIG_FILE_NAME, QSettings.IniFormat)
# возращаем значения
# для поиска
settings.setValue('BoolValue_search_1', int(self.action_search_options_1.isChecked()))
settings.setValue('BoolValue_search_2', int(self.action_search_options_2.isChecked()))
settings.setValue('BoolValue_search_3', int(self.action_search_options_3.isChecked()))
# настройка для языка
settings.setValue('BoolValue_language_russian', int(self.language_russian.isChecked()))
settings.setValue('BoolValue_language_english', int(self.language_english.isChecked()))
# для тем
settings.setValue('BoolValue_theme_1', int(self.view_theme_1.isChecked()))
settings.setValue('BoolValue_theme_2', int(self.view_theme_2.isChecked()))
# настройка для строки состояния
settings.setValue('BoolValue_statusBar', int(self.options_settings_status.isChecked()))
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
После строки:
Settings.load_settings(self)
добавьте:
if self.language_english.isChecked():
self.language_english.trigger()
else:
self.language_russian.trigger()
import sys
import ctypes
import os
import re
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QTranslator, QEvent, QSettings
from PyQt5.QtWidgets import QApplication
#from options import Settings
class Settings(QtWidgets.QWidget):
def __init__(self, parent = None):
super().__init__(parent)
self.parent = parent
# берём нужные действия для поиска
self.action_search_options_1 = self.parent.action_search_options_1
self.action_search_options_2 = self.parent.action_search_options_2
self.action_search_options_3 = self.parent.action_search_options_3
# для строки состояния
self.status_1 = self.parent.status_1
# настройка для генерации ключей
self.action_generator_combination_1 = self.parent.action_generator_combination_1
self.action_generator_combination_2 = self.parent.action_generator_combination_2
self.action_generator_combination_3 = self.parent.action_generator_combination_3
self.action_generator_combination_4 = self.parent.action_generator_combination_4
self.settings_generator_length_1 = self.parent.settings_generator_length_1
self.settings_generator_length_2 = self.parent.settings_generator_length_2
self.settings_generator_length_3 = self.parent.settings_generator_length_3
self.settings_generator_register_1 = self.parent.settings_generator_register_1
self.settings_generator_register_2 = self.parent.settings_generator_register_2
self.settings_generator_register_3 = self.parent.settings_generator_register_3
# настройка для языка
self.language_russian = self.parent.language_russian
self.language_english = self.parent.language_english
# настройка для тем
self.view_theme_1 = self.parent.view_theme_1
self.view_theme_2 = self.parent.view_theme_2
# настройка для строки состояния
self.options_settings_status = self.parent.options_settings_status
def load_settings(self):
settings = QSettings(self.CONFIG_FILE_NAME, QSettings.IniFormat)
# для поиска
self.action_search_options_1.setChecked(bool(int(settings.value('BoolValue_search_1', 1))))
self.action_search_options_2.setChecked(bool(int(settings.value('BoolValue_search_2', 0))))
self.action_search_options_3.setChecked(bool(int(settings.value('BoolValue_search_3', 0))))
# настройка языка
self.language_russian.setChecked(bool(int(settings.value('BoolValue_language_russian', 1))))
self.language_english.setChecked(bool(int(settings.value('BoolValue_language_english', 0))))
# для тем
self.view_theme_1.setChecked(bool(int(settings.value('BoolValue_theme_1', 0))))
self.view_theme_2.setChecked(bool(int(settings.value('BoolValue_theme_2', 1))))
# настройка для строки состояния
self.options_settings_status.setChecked(bool(int(settings.value('BoolValue_statusBar', 1))))
def save_settings(self):
settings = QSettings(self.CONFIG_FILE_NAME, QSettings.IniFormat)
# возращаем значения
# для поиска
settings.setValue('BoolValue_search_1', int(self.action_search_options_1.isChecked()))
settings.setValue('BoolValue_search_2', int(self.action_search_options_2.isChecked()))
settings.setValue('BoolValue_search_3', int(self.action_search_options_3.isChecked()))
# настройка для языка
settings.setValue('BoolValue_language_russian', int(self.language_russian.isChecked()))
settings.setValue('BoolValue_language_english', int(self.language_english.isChecked()))
# для тем
settings.setValue('BoolValue_theme_1', int(self.view_theme_1.isChecked()))
settings.setValue('BoolValue_theme_2', int(self.view_theme_2.isChecked()))
# настройка для строки состояния
settings.setValue('BoolValue_statusBar', int(self.options_settings_status.isChecked()))
#import window_1
class Page_find_numbers(QtWidgets.QWidget):
def __init__(self, parent = None):
super().__init__(parent)
self.parent = parent
# списки для хранения найденных данных в тексте
self.email_text = []
self.telephon_text = []
# обьекты
self.button_clear = QtWidgets.QPushButton("Очистить")
self.button_find = QtWidgets.QPushButton("Запустить")
self.button_save = QtWidgets.QPushButton("Сохранить\nв txt-файл")
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.button_save, 4, 1, alignment = QtCore.Qt.AlignTop)
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.toSeekNomerEmail)
self.button_save.clicked.connect(self.toSaveNomerEmail)
def toSeekNomerEmail(self):
PlainText = self.textedit_1.toPlainText()
self.action_options_1 = self.parent.action_search_options_1
self.action_options_2 = self.parent.action_search_options_2
self.action_options_3 = self.parent.action_search_options_3
self.status_1 = self.parent.status_1
self.options_settings_status = self.parent.options_settings_status
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}')
# собирает данные
self.email_text = email_akk.findall(PlainText)
self.telephon_text = inserted_text_1.findall(PlainText)
# если в массиве оказались телефонные номера или акк и почты
if len(self.email_text) > 0 or len(self.telephon_text) > 0:
# проверка на установленный режим действия
# искать всё (действие)
if self.action_options_1.isChecked() == True:
text_1 = '' # для телефонных номеов
text_2 = '' # для почт и аккаунтов
# преобразовать в нормальные вид
for nomer in self.telephon_text:
text_1 += nomer + "\n"
for email in self.email_text:
text_2 += email + "\n"
# проверка на то что будет выводится в тексте
# только телефонные номера
if len(text_1) > 0 and len(text_2) == 0:
self.textedit_2.setText("Телефонные номера:\n" + text_1)
# только почты
elif len(text_1) == 0 and len(text_2) > 0:
self.textedit_2.setText("Электронные почты:\n" + text_2)
# всё вместе
elif len(text_1) > 0 and len(text_2) > 0:
self.textedit_2.setText("Телефонные номера:\n" + text_1\
+ "\nЭлектронные почты:\n" + text_2)
# панель состояние
self.status_1.showMessage("Телефонные номера - " + str(len(self.telephon_text))\
+ "; Электронные почты - " + str(len(self.email_text)), msecs = 3500)
# искать телефонные номера
elif self.action_options_2.isChecked() == True:
text_1 = ''
for nomer in self.telephon_text:
text_1 += nomer + "\n"
# если оказались данные
if len(text_1) > 0:
self.textedit_2.setText("Телефонные номера:\n" + text_1)
elif len(text_1) == 0:
self.textedit_2.setText("Данных не обнаружено!")
# панель состояния
self.status_1.showMessage("Найдено: телефонные номера - " + str(len(self.telephon_text)), msecs = 3500)
# искать аккаунты и почты
elif self.action_options_3.isChecked() == True:
text_2 = ''
for email in self.email_text:
text_2 += email + "\n"
# если оказались данные
if len(text_2) > 0:
self.textedit_2.setText("Электронные почты:\n" + text_2)
elif len(text_2) == 0:
self.textedit_2.setText("Данных не обнаружено!")
# панель состояния
self.status_1.showMessage("Найдено: электронные почты и акк - " + str(len(self.email_text)), msecs = 3500)
# если в списке нет номеров
elif len(self.email_text) == 0 and len(self.telephon_text) == 0:
self.textedit_2.setText("Данных не обнаружено!")
# если в первом тексте не обнаруженно данных для поиска
elif len(PlainText) == 0:
self.textedit_2.setText("Введите данные!")
def toSaveNomerEmail(self):
if len(self.email_text) > 0 or len(self.telephon_text) > 0:
# проверка на путь
if os.path.exists("C:/nomera_email") == False:
# созданте папки
os.mkdir('C:/nomera_email')
# проверка на установленность действия
# поиск всего
if self.action_options_1.isChecked() == True:
telephon_nomer_email = open('C:/nomera_email/Telephonnue_nomera_email.txt', 'w')
# записывается номера и акк, и почты
if len(self.telephon_text) > 0: # проверка на номера
telephon_nomer_email.write("Телефонные номера:\n")
for tel_nomer in self.telephon_text:
telephon_nomer_email.write(tel_nomer + "\n")
telephon_nomer_email.write("")
if len(self.email_text) > 0: # проверка на акк или почта
telephon_nomer_email.write("\nАккаунты, электронные почты:\n")
for email in self.email_text:
telephon_nomer_email.write(email + '\n')
telephon_nomer_email.write("")
telephon_nomer_email.close()
# если устновлено поиск телефонных номеров
elif self.action_options_2.isChecked() == True:
# запись телефонный номеров
if len(self.telephon_text) > 0:
telephon_nomer = open('C:/nomera_email/Telephonnue_nomera.txt', 'w')
telephon_nomer.write("Телефонные номера:\n")
for tel_nomer in self.telephon_text:
telephon_nomer.write(tel_nomer + "\n")
telephon_nomer.write("")
telephon_nomer.close()
# поиск почт и аккаунтов
elif self.action_options_3.isChecked() == True:
# запись аккаунтов
if len(self.email_text) > 0:
email_file = open('C:/nomera_email/Email.txt', 'w')
email_file.write("\nАккаунты, электронные почты:\n")
for email in self.email_text:
email_file.write(email + '\n')
email_file.write("")
email_file.close()
# если путь существует
elif os.path.exists("C:/nomera_email") == True:
# проверка на устновленность режима поиска
if self.action_options_1.isChecked() == True:
telephon_nomer_email = open('C:/nomera_email/Telephonnue_nomera_email.txt', 'a')
# запись номеров
if len(self.telephon_text) > 0:
telephon_nomer_email.write("\nТелефонные номера:\n")
for tel_nomer_1 in self.telephon_text:
telephon_nomer_email.write(tel_nomer_1 + "\n")
telephon_nomer_email.write("")
# запись аккаунтов
if len(self.email_text) > 0:
telephon_nomer_email.write("\nАккаунты и електронные почты:\n")
for email_1 in self.email_text:
telephon_nomer_email.write(email_1 + '\n')
telephon_nomer_email.write("")
telephon_nomer_email.close()
elif self.action_options_2.isChecked() == True:
if len(self.telephon_text) > 0:
telephon_nomer = open('C:/nomera_email/Telephonnue_nomera.txt', 'a')
telephon_nomer.write("\nТелефонные номера:\n")
for tel_nomer_1 in self.telephon_text:
telephon_nomer.write(tel_nomer_1 + "\n")
telephon_nomer.write("")
telephon_nomer.close()
elif self.action_options_3.isChecked() == True:
if len(self.email_text) > 0:
email_file = open('C:/nomera_email/Email.txt', 'a')
email_file.write("\nАккаунты и электронные почты:\n")
for email_1 in self.email_text:
email_file.write(email_1 + '\n')
email_file.write("")
email_file.close()
# вывод информации после сохранения
self.textedit_2.setText("Вы сохранили в txt-файл,\nна путь - C:\\nomera_email")
# если данных для сохранения не обнаружено
elif len(self.email_text) == 0 and len(self.telephon_text) == 0:
self.textedit_2.setText("Данных для сохранения в\ntxt-файл не обнаружено!")
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
QtWidgets.QMainWindow.__init__(self)
# создание файла для сохранения натроек
if os.name == "nt": # проверка на название системы
self.CONFIG_FILE_NAME = 'settings\\config.ini'
self.centralWidget = QtWidgets.QWidget() # создаём центральный виджет
self.setCentralWidget(self.centralWidget)
# self.window_1 = window_1.Page_find_numbers(self)
self.window_1 = Page_find_numbers(self)
self.trans = QTranslator(self)
self.mainLayout = QtWidgets.QVBoxLayout(self.centralWidget)
# settings
self.setFixedSize(640, 600)
self.setWindowTitle(" B U G ")
self.setWindowIcon(QtGui.QIcon("settings\\bug.ico"))
# делаем сборку
self.widget_main = self.create_page()
self.mainLayout.addWidget(self.widget_main)
self.create_menuBar()
self.create_toolBar()
# класс для сохранения настроек
Settings.load_settings(self)
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
if self.language_english.isChecked():
self.language_english.trigger()
else:
self.language_russian.trigger()
# ++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# для строки состоянии
self.label_1 = QtWidgets.QLabel("v 1.0")
self.label_1.setStyleSheet("font-size: 18px; color: black;")
self.status_1.addPermanentWidget(self.label_1)
self.status_1.showMessage("Добро пожаловать!", msecs = 4000)
self.setStatusBar(self.status_1)
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.menu_options = QtWidgets.QMenu("Опции")
self.menu_view = QtWidgets.QMenu('Вид')
self.menu_help = QtWidgets.QMenu("Справка")
self.sub_menu_in_options_settings_1 = 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.menu_options.addMenu(self.sub_menu_in_options_settings_1)
# настройки поиска
self.sub_menu_options_search = QtWidgets.QMenu("Настройки поиска")
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.menu_options.addMenu(self.sub_menu_options_search) # добавление в меню опции
# настройка языка
self.delimiter_2 = QtWidgets.QAction()
self.delimiter_2.setSeparator(True)
self.menu_options.addAction(self.delimiter_2)
self.language_menu = QtWidgets.QMenu("Язык")
self.language_russian = QtWidgets.QAction("Русcкий (ru)")
self.language_russian.setCheckable(True)
self.language_russian.setChecked(True)
self.language_english = QtWidgets.QAction("English (en)")
self.language_english.setCheckable(True)
self.group_action_6 = QtWidgets.QActionGroup(self.language_menu)
self.group_action_6.addAction(self.language_english)
self.group_action_6.addAction(self.language_russian)
# датчик если будет изменения внутри ++++
self.group_action_6.triggered.connect(self.clicked_language)
self.language_menu.addAction(self.language_english)
self.language_menu.addAction(self.language_russian)
self.menu_options.addMenu(self.language_menu)
# настройка тем
self.sub_menu_view_themes = QtWidgets.QMenu("Цветовая схема")
self.view_theme_1 = QtWidgets.QAction("Тёмно-синяя тема")
self.view_theme_1.setCheckable(True)
self.view_theme_2 = QtWidgets.QAction("Светло-серая тема")
self.view_theme_2.setCheckable(True)
self.view_theme_2.setChecked(True)
self.view_theme_3 = QtWidgets.QAction("Тёмно-коричневая тема")
self.view_theme_3.setCheckable(True)
self.group_action_5 = QtWidgets.QActionGroup(self.sub_menu_view_themes)
self.group_action_5.addAction(self.view_theme_1)
self.group_action_5.addAction(self.view_theme_2)
self.group_action_5.addAction(self.view_theme_3)
self.sub_menu_view_themes.addAction(self.view_theme_1)
self.sub_menu_view_themes.addAction(self.view_theme_2)
self.sub_menu_view_themes.addAction(self.view_theme_3)
self.menu_view.addMenu(self.sub_menu_view_themes)
# добавляем отдельное меню в главное меню
self.menu.addMenu(self.menu_options)
self.menu.addMenu(self.menu_view)
self.menu.addMenu(self.menu_help)
# датчики
self.options_settings_status.triggered.connect(self.toggleMenu)
# добавляем в окно
self.setMenuBar(self.menu)
def clicked_language(self, lang):
if lang.text() == "English (en)":
self.trans.load('ru-eng')
_app = QApplication.instance()
_app.installTranslator(self.trans)
else:
_app = QApplication.instance()
_app.removeTranslator(self.trans)
def retranslateUi(self): # перевод на другой язык
self.button_1.setText(QApplication.translate('MainWindow', 'Перейти к поиску телефонных\nномеров и электронных почт'))
self.window_1.button_clear.setText(QApplication.translate('MainWindow', 'Очистить'))
self.window_1.button_find.setText(QApplication.translate('MainWindow', 'Запустить'))
self.window_1.button_save.setText(QApplication.translate('MainWindow', 'Сохранить\nв txt-файл'))
self.window_1.label_1.setText(QApplication.translate('MainWindow', 'Вставте сюда текст, в котором хотите\nнайти телефонные номера и электронные\nпочты.'))
self.window_1.label_2.setText(QApplication.translate('MainWindow', 'Результат:'))
self.action_back.setText(QApplication.translate('MainWindow', 'Вернуться назад')) # на ToolBar
self.menu_options.setTitle(QApplication.translate('MainWindow', 'Опции'))
self.menu_view.setTitle(QApplication.translate('MainWindow', 'Вид'))
self.menu_help.setTitle(QApplication.translate('MainWindow', 'Справка'))
self.sub_menu_in_options_settings_1.setTitle(QApplication.translate('MainWindow', "настройки"))
self.options_settings_status.setText(QApplication.translate('MainWindow', "Включить панель состояния"))
self.sub_menu_options_search.setTitle(QApplication.translate("MainWindow", "Настройки поиска"))
self.action_search_options_1.setText(QApplication.translate('MainWindow', "Искать всё"))
self.action_search_options_2.setText(QApplication.translate('MainWindow', "Телефонные номера"))
self.action_search_options_3.setText(QApplication.translate('MainWindow', "Электронные почты и акк"))
def changeEvent(self, event):
if event.type() == QEvent.LanguageChange:
self.retranslateUi()
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.show()
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 self.language_english.isChecked():
self.language_english.trigger()
else:
self.language_russian.trigger()
# для сохранения настроек при выходе из приложения
def closeEvent(self, event):
Settings.save_settings(self)
super().closeEvent(event)
if __name__ == '__main__':
myappid = 'mycompany.myproduct.subproduct.version'
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid)
app = QtWidgets.QApplication(sys.argv)
app.setWindowIcon(QtGui.QIcon("settings\\bug.ico"))
MainWindow = MainWindow()
MainWindow.show()
sys.exit(app.exec_())