Доступ к атрибутам объекта в окне pyqt в отдельном модуле

#python #pyqt

#питон #pyqt

Вопрос:

У меня есть главное окно, созданное в одном модуле python. Этот модуль также содержит определение класса, используемое для создания объекта с именем my_settings.

У меня также есть отдельный модуль, который создает другое окно (которое по разным причинам должно находиться в другом модуле). Это окно позволяет вводить различные данные, такие как открытие файла и сохранение некоторых настроек после нажатия кнопок бла-бла-бла.

Что я хочу сделать, так это изменить атрибуты my_settings. Упрощенная версия кода представляет собой:

ОСНОВНОЙ МОДУЛЬ

 class MainWindow(QMainWindow):   def __init__(self,parent=None):  super(MainWindow, self).__init__(parent)    QMainWindow.__init__(self)  uic.loadUi(self.some_directory   "arc_custom_main.ui", self)   self.some_button.clicked.connect(self.open_some_widget)   def open_some_widget(self):  widget = widget_in_other_module(self)  widget_in_other_module.exec_()  app = QApplication(sys.argv) my_settings=settings() _mainWindow = MainWindow() _mainWindow.show()  

ОТДЕЛЬНЫЙ МОДУЛЬ

 class widget_in_other_module(QDialog):    def __init__(self, parent):   my_settings.temppath = my_settings.OutputDir   QDialog.__init__(self)  self.parent = parent  my_settings.some_attribute= foo   uic.loadUi("some.ui", self)    self.pushButtonOpenMain.clicked.connect(self.openMain)   def openMain(self):  my_settings.some_other_attibute=bar  

Проблема, с которой я столкнулся, заключается в том, что я не могу найти способ доступа к my_settings в методе openMain модуля widget_in_other_module. Я немного новичок в qt и ни за что на свете не могу решить, где мне следует передавать свои настройки. По разным причинам мне нужно, чтобы вся функциональность модуля widget_in_other_module находилась за пределами основного модуля (в основном для удобства чтения и будущих запланированных изменений в основном модуле). Я старался,насколько мог, например, включить его в качестве параметра в строку self.pushButtonOpenMain.clicked.connect(self.openMain, my_settings), но это, похоже, недопустимо. Я упускаю здесь что-то основное?

Ответ №1:

Создайте экземпляр переменной настроек в отдельном модуле и импортируйте эту переменную туда, где она вам нужна. Это может быть объект класса или просто словарь.

storage.py

 class Settings:  def __init__(self):  print("Settings")  my_settings = Settings()  

MainWindow.py

 from PyQt5.QtWidgets import QMainWindow, QApplication import sys from Widget import Widget  from storage import my_settings  class MainWindow(QMainWindow):   def __init__(self,parent=None):  super(MainWindow, self).__init__(parent)  QMainWindow.__init__(self)  self.open_some_widget()   def open_some_widget(self):  widget = Widget()  widget.show()  widget.test()  self._widget = widget  my_settings.foo = 10  app = QApplication(sys.argv) _mainWindow = MainWindow() _mainWindow.show() app.exec_()  

Widget.py

 from PyQt5.QtWidgets import QWidget  from storage import my_settings  class Widget(QWidget):   def test(self):  print(my_settings.foo)