es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Problema con PyQt5 al pasar una variable.

Estoy trabajando con una GUI de PyQt5 y encuentro un problema. Quiero compartir el objeto Person con todo el programa, pero cuando lo hago, el programa se vuelve recursivo. He intentado muchos métodos para compartir el objeto persona con otras funciones, pero siempre el objeto se convierte en falso o en objeto de conexión. ¿Alguien sabe por qué funciona así?

“`python
import sys
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QDialog, QApplication, QListWidget, QListWidgetItem, QMainWindow, QVBoxLayout
from PyQt5.uic import loadUi
from lot import DatabaseofLoty
from person import Person
from ticket import Ticket
from classes<em>io import read</em>from<em>csv
from kamerdyner import Kamerydner, DatabaseofKamerdyner
from random import choice
kam1 = Kamerydner(1,"Jake")
kam2 = Kamerydner(2, "Christina")
kam3 = Kamerydner(3,"Robert")
databases = DatabaseofKamerdyner([kam1, kam2 ,kam3])

class Airport(QMainWindow):
def <strong>init</strong>(self):
super(Airport,self).<strong>init</strong>()
loadUi("airrport.ui",self)
def save():
global person
a = self.savefunction
person = a
def gotonewclas(a):
return self.gotonewclass(person)
self.Confirmbutton.clicked.connect(save)
self.Confirmbutton.clicked.connect(gotonewclas)

<pre><code>def savefunction(self):
name = self.name.text()
pesel = self.pesel.text()
birthdate = self.birthdate.text()
person = Person(name, pesel, birthdate)
return person

def gotonewclass(self,person):
print(person)
chooselot = Chooselot()
widget.addWidget(chooselot)
widget.setCurrentIndex(widget.currentIndex()+1)
</code></pre>

def guiMain(args):
global widget
app = QApplication(args)
mainwindow = Airport()
widget=QtWidgets.QStackedWidget()
widget.addWidget(mainwindow)
widget.setFixedWidth(480)
widget.setFixedHeight(620)
widget.show()
return app.exec()

if name == "main":
guiMain(sys.argv)
“`

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema probablemente se debe al uso de una variable global para almacenar el objeto “person”. Cuando se llama a la función “savefunction”, se establece la variable global “person” en el nuevo objeto “Person” creado. Sin embargo, cuando se llama a la función “gotonewclass”, toma el objeto “person” como argumento en lugar de usar la variable global. Esto crea una nueva instancia del objeto “Person”, que a su vez llama nuevamente a la función “savefunction”, creando una recursión infinita.

    Para solucionar este problema, puedes pasar el objeto “person” como argumento a la función “gotonewclass” en lugar de usar una variable global. Puedes modificar la función “savefunction” para que devuelva el objeto “Person” en lugar de establecer una variable global, y luego modificar las llamadas “clicked.connect” para pasar el objeto devuelto a la función “gotonewclass”. Aquí tienes un ejemplo de implementación:

    class Airport(QMainWindow):
        def __init__(self):
            super(Airport,self).__init__()
            loadUi("airrport.ui",self)
            self.Confirmbutton.clicked.connect(self.on_confirm_clicked)
    
        def on_confirm_clicked(self):
            person = self.savefunction()
            self.gotonewclass(person)
    
        def savefunction(self):
            name = self.name.text()
            pesel = self.pesel.text()
            birthdate = self.birthdate.text()
            person = Person(name, pesel, birthdate)
            return person
    
        def gotonewclass(self,person):
            print(person)
            chooselot = Chooselot()
            widget.addWidget(chooselot)
            widget.setCurrentIndex(widget.currentIndex()+1)
    
    def guiMain(args):
        global widget
        app = QApplication(args)
        mainwindow = Airport()
        widget=QtWidgets.QStackedWidget()
        widget.addWidget(mainwindow)
        widget.setFixedWidth(480)
        widget.setFixedHeight(620)
        widget.show()
        return app.exec_()
    
    if __name__ == "__main__":
        guiMain(sys.argv)
    

    En esta implementación, la función “on_confirm_clicked” está conectada a la señal “clicked” del botón “Confirmbutton”. Cuando se hace clic en el botón, llama a la función “savefunction” para crear un nuevo objeto “Person” y luego lo pasa a la función “gotonewclass”.

    Ten en cuenta que dado que ahora el objeto “Person” se pasa como argumento a la función “gotonewclass”, deberás actualizar la llamada a self.gotonewclass() en la función “on_confirm_clicked” para incluir el objeto “person” como argumento.

Comments are closed.