¿Puedo usar una variable de una función que está dentro de otra clase?

Lo que intento hacer es crear una ventana con 8 casillas de verificación. El usuario hará clic en los que son relevantes y presionará "Calculate Job". Ese botón debe abrir una nueva ventana que contenga botones/secciones/lo que sea por sólo las opciones seleccionadas en la ventana 1. Suena bien... Tengo la ventana 1 en clase primero. Cuando haga clic en el botón aparece la nueva ventana, ¡bueno! Pero ahora necesito encontrar una manera de decir "Si alguna de estas secciones son seleccionadas entonces haga algo en la ventana 2".

código:

from PyQt5 import QtWidgets
import sys
import qdarkstyle

class First(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(First, self).__init__(parent)
        self.title = 'Job Price Calculator'
        self.left = 100
        self.top = 100
        self.width = 320
        self.height = 350
        self.initUI()
        self.dialog = Second()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.data_processing = QtWidgets.QCheckBox('Data Processing', self)
        self.data_processing.move(50, 50)

        self.digital_print = QtWidgets.QCheckBox('Digital Print', self)
        self.digital_print.move(50, 100)

        self.calculate = QtWidgets.QPushButton('Calculate Job', self)
        self.calculate.move(100, 250)
        self.calculate.clicked.connect(self.on_button_click)

    def on_button_click(self):
        self.dialog.show()

class Second(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(Second, self).__init__(parent)
        self.title = 'Job Specification'
        self.left = 500
        self.top = 100
        self.width = 1080
        self.height = 920
        self.initUI_specification()

    def initUI_specification(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)
        self.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())

        if self.data_processing.isChecked():
            self.data_processing_info()

        if self.digital_print.isChecked():
            self.digital_print_info()

    def data_processing_info(self):
        self.temp_button = QtWidgets.QPushButton('Temp Button', self)
        self.temp_button.move(100, 250)

    def digital_print_info(self):
        self.temp_button2 = QtWidgets.QPushButton('Temp Button 2', self)
        self.temp_button2.move(100, 450)

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    main = First()
    main.show()
    sys.exit(app.exec_())

Así que lo que quiero hacer en la clase 'Second' es utilizar la variable de casilla de verificación de sí mismo. data_procesamiento para comprobar si se ha habilitado, si tiene entonces quiero levantar un botón en la ventana de Second gui.

¿Es lo que intento hacer posible? ¿Debería estar pensando en una manera diferente de hacer esto? Me gustaría que alguien piense en esto si es posible, y un poco de guía. Realmente apreciaría la ayuda, he pasado todo mi fin de semana jugando con esto y sólo estoy sin llegar a ninguna parte.

Pregunta hecha hace 3 años, 4 meses, 25 días - Por quantumcoder


3 Respuestas:

  • Necesitas llamar a tu segunda clase dentro de primera clase cuando haga clic en tu casilla de verificación

    from PyQt5 import QtWidgets
    import sys
    import qdarkstyle
    
    class First(QtWidgets.QMainWindow):
        def __init__(self, parent=None):
            super(First, self).__init__(parent)
            self.title = 'Job Price Calculator'
            self.left = 100
            self.top = 100
            self.width = 320
            self.height = 350
            self.initUI()
            
        def initUI(self):
            self.setWindowTitle(self.title)
            self.setGeometry(self.left, self.top, self.width, self.height)
    
            self.data_processing = QtWidgets.QCheckBox('Data Processing', self)
            self.data_processing.move(50, 50)
            self.data_processing.stateChanged.connect(self.checkbox_clicked)
    
            self.digital_print = QtWidgets.QCheckBox('Digital Print', self)
            self.digital_print.move(50, 100)
    
            self.calculate = QtWidgets.QPushButton('Calculate Job', self)
            self.calculate.move(100, 250)
            self.calculate.clicked.connect(self.on_button_click)
    
            self.secondClass = Second()
    
        def on_button_click(self):
            self.dialog.show()
        
        def checkbox_clicked(self):
            if self.data_processing.isChecked():
                self.secondClass.data_processing_info()
                self.secondClass.show()
            else:
                self.secondClass.hide() #hide or close - as your requirement
    
    class Second(QtWidgets.QMainWindow):
        def __init__(self, parent=None):
            super(Second, self).__init__(parent)
            self.title = 'Job Specification'
            self.left = 500
            self.top = 100
            self.width = 1080
            self.height = 920
            self.initUI_specification()
    
        def initUI_specification(self):
            self.setWindowTitle(self.title)
            self.setGeometry(self.left, self.top, self.width, self.height)
            self.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
    
    
        def data_processing_info(self):
            self.temp_button = QtWidgets.QPushButton('Temp Button', self)
            self.temp_button.move(100, 250)
    
        def digital_print_info(self):
            self.temp_button2 = QtWidgets.QPushButton('Temp Button 2', self)
            self.temp_button2.move(100, 450)
    
    if __name__ == '__main__':
        app = QtWidgets.QApplication(sys.argv)
        main = First()
        main.show()
        sys.exit(app.exec_())
    

    Respondida el Dec 21, 2020 a las 09:12 - por codecrusader

    Votos positivos: 0 | Votos negativos: 0

  • Sí, es posible acceder a variables de una función que está dentro de otra clase en Python. Sin embargo, en el código que proporcionaste, la variable data_processing es una instancia de QCheckBox en la clase First, por lo que no es directamente accesible desde la clase Second.

    Para lograr lo que deseas, podrías pasar la información necesaria de una clase a la otra. Una forma de hacerlo es modificar el método initUI_specification de la clase Second para que reciba un parámetro que indique si la casilla de verificación ha sido marcada o no. Aquí te muestro cómo podrías modificar tu código:

    En la clase First, modifica el método on_button_click para enviar la información necesaria a la instancia de Second:

    python
    def on_button_click(self):
        is_data_processing_checked = self.data_processing.isChecked()
        is_digital_print_checked = self.digital_print.isChecked()
        self.dialog.show_info(is_data_processing_checked, is_digital_print_checked)
    

    Y en la clase Second, agrega un nuevo método show_info que recibirá los valores de las casillas de verificación:

    python
    def show_info(self, is_data_processing_checked, is_digital_print_checked):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)
        self.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
    
        if is_data_processing_checked:
            self.data_processing_info()
    
        if is_digital_print_checked:
            self.digital_print_info()
    

    De esta manera, cuando se haga clic en el botón en la ventana 1, se enviará la información sobre las casillas de verificación marcadas a la ventana 2, y se mostrarán los nuevos elementos en función de esa información.

    Espero que esta guía te sea útil y te ayude a resolver el problema que estás enfrentando. ¡Déjame saber si tienes alguna otra pregunta!

    Respondida el Dec 22, 2020 a las 09:15 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Sí, es posible utilizar una variable de una función que está dentro de otra clase. Sin embargo, en tu código, la variable data_processing está definida en la clase First, no en la clase Second. Para acceder a ella en Second, debes pasarla como argumento al constructor de Second o utilizar una variable global.

    Una forma de hacerlo es pasar la variable como argumento al constructor:

    python
    class First(QtWidgets.QMainWindow):
        def __init__(self, parent=None):
            super(First, self).__init__(parent)
            

    ... (código existente)

    def on_button_click(self): self.dialog = Second(self.data_processing.isChecked()) self.dialog.show() class Second(QtWidgets.QMainWindow): def __init__(self, data_processing_checked, parent=None): super(Second, self).__init__(parent)

    ... (código existente)

    if data_processing_checked: self.data_processing_info()

    Otra forma es utilizar una variable global:

    python
    data_processing_checked = False
    
    class First(QtWidgets.QMainWindow):
        def __init__(self, parent=None):
            super(First, self).__init__(parent)
            

    ... (código existente)

    def on_button_click(self): global data_processing_checked data_processing_checked = self.data_processing.isChecked() self.dialog = Second() self.dialog.show() class Second(QtWidgets.QMainWindow): def __init__(self, parent=None): super(Second, self).__init__(parent)

    ... (código existente)

    if data_processing_checked: self.data_processing_info()

    Ten en cuenta que el uso de variables globales debe evitarse siempre que sea posible, ya que puede provocar problemas de mantenimiento y legibilidad del código.

    Respondida el Dec 22, 2020 a las 09:17 - por Gemini

    Votos positivos: 0 | Votos negativos: 0