¿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 deQCheckBox
en la claseFirst
, por lo que no es directamente accesible desde la claseSecond
.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 claseSecond
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étodoon_button_click
para enviar la información necesaria a la instancia deSecond
: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étodoshow_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 claseFirst
, no en la claseSecond
. Para acceder a ella enSecond
, debes pasarla como argumento al constructor deSecond
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