PyQt5 - потеря значения экземпляра при передаче другому классу - PullRequest
0 голосов
/ 24 апреля 2020

Я пишу класс, который используется для регистрации функциональности в PyQT5 и столкнулся с ситуацией, когда излучаемый сигнал очищается.

Это функция регистрации, которая излучает сигнал:

class enableLogging(QMessageBox):

    logger_enableLogging = logging.getLogger()

    def __init__(self, className=None, parent=None):
    '''
    This is the program to enable logging. When Control + L is pressed in any window, this QMessageBox will be
    presented to the user. The class is then dynamically inherited from the classing class that the keyboard event
    was called in. The signal and slot are linked together to emit the outcome of the logging mode.
    :param className: name of class that called for logging
    :param parent: QMessageBox
    '''
    self.logger_enableLogging = logging.getLogger('enableLogging')
    super(enableLogging, self).__init__(parent)
    self.classNameInherit = className
    self.logger_enableLogging.debug(f"The class was called from the class: {self.classNameInherit}")

    self.local_logging_inst = self.construct()
    self.local_logging_inst.loggingChanged.connect(self.local_logging_inst.logging_method_return)
    self.logging_method = ''
    self.logging_locally_label = ''
    self.logging_globally_label = ''

    self.determine_reason()
    self.logging_window()

def loggingClicked(self, button):
    '''
    Finally, when clicking a button, the
    logic looks to see which button was clicked and whether it will be enabled or disabled.
    The logging method (LOCAL/GLOBAL) as well as the logging reason (ENABLE/DISBALE) is passed back to the class
    that called the logging.
    :param button: Button that was clicked
    :return: Str: ENABLE/DISABLE, Str: LOCAL/REMOTE
    '''
    self.logger_enableLogging.debug(f"The button: {button.text()} was clicked.")
    global logging_enabledLocal
    global logging_enabledGlobal

    if button.text() == 'Enable Local Logging':
        self.logger_enableLogging.debug('You pressed Log Locally.')
        self.logging_method = 'LOCAL'
        self.local_logging_inst.loggingChanged.emit(self.logging_method, 'ENABLE')

И это класс, которому я передаю значения:

    class SQLConnection(QDialog, SQL_Ui_Connection):

        loggingChanged = pyqtSignal(str, str)

    @pyqtSlot(str, str)
    def logging_method_return(self, logging_method, reason):

        self.logging_method = logging_method
        self.reason = reason
        global logging_enabledLocal
        global logging_enabledGlobal

        if reason == 'ENABLE':

            if (logging_enabledGlobal and (self.__class__.__name__ not in logging_enabledLocal)) \
                    or ((self.__class__.__name__ not in logging_enabledLocal) and self.logging_method == 'LOCAL'):

                logging_enabledLocal.append(self.__class__.__name__)
                self.logger_sqlConnection = logging.getLogger('sqlConnection')
                if len(self.sqlconnection_handlers) == 0:
                    self.sqlconnection_handlers = self.logger_sqlConnection.handlers.copy()
                    ^^^^^^self.local_handlers.extend(self.logger_sqlConnection.handlers.copy())
                if len(self.logger_sqlConnection.handlers) == 0:
                    self.logger_sqlConnection.handlers.extend(self.sqlconnection_handlers)
                *****self.logger_sqlConnection.debug(f"Starting Logger : {self.__class__.__name__}")

Затем я печатаю сообщение об отладке, которое я написал в своей функции ведения журнала в строке, обозначенной ****.

Однако, когда я выполняю другую функцию в классе, мой регистратор все еще не включается.

def connection_to_db(self):

    self.logger_sqlConnection.debug(f"Running: {inspect.currentframe().f_code.co_name} Function")

Эта функция не печатается, и при запуске отладки регистратор остается пустым. Чтобы обойти это, я использую строку с ^^^^^, чтобы сохранить обработчики в атрибуте класса, а затем вызываю другую функцию для заполнения моего регистратора.

def turnOnLogging(self):

    self.logger_sqlConnection.handlers = self.local_handlers

Я знаю, что нужно быть чем-то, чего я в принципе упускаю; это не может быть реальным способом передачи значений между классами и их использования.

Мой вопрос: каков более подходящий способ передачи значений из другого класса в экземпляр при использовании слота / сигналов? Я не думаю, что создание атрибутов класса как временных держателей является правильным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...