将对象传递给多个函数后更新对象

Updating an object after passing it into multiple functions

我正在创建一个对象的实例,将其传递给另一个对象,然后将其传递给另一个对象,如下所示:

person = Person(fname, lname)
info = Information(person)
summary = Summary(person)

qt_stack_widget.add_child(info)
qt_stack_widget.add_child(summary)

qt_stack_widget.start()
qt_stack_widget.show()

Information 对象中,它将收集用户输入的信息,然后使用 person 对象的修改器向该对象添加信息。

Summary 中,它将获取 person 对象,然后从中收集更多信息,并在进一步改变对象之前喜欢。

但是 Information 中对 person 对象执行的突变不会反映在 Summary 中的 person 对象中。

有人知道为什么会这样吗?

我知道更改没有反映出来,因为我正在将初始空对象 person 发送到 infosummary,但是我怎样才能使 person summary 中的对象在 information?

中的更改后更新

程序是这样运行的:

  1. 用户启动程序
  2. 用户输入信息然后变异为person
  3. 用户点击next进入小程序下一页
  4. 页面显示上一页输入的信息

所以基本上一旦 person 对象在 Information 中更新,更改就不会反映在发送到 Summaryperson 对象中,即使它是同一个对象。

我想问的是,如何才能让 person 对象反映在 Information 中所做的 Summary 中的更改?

主要:

#!/usr/bin/python3

from PyQt5.QtWidgets import QApplication
import sys
import root_ui
import Individual

import views.launch
import basic_info


def main():
    app = QApplication(sys.argv)
    root = root_ui.RootUI()

    individual = Individual.Individual()

    splash = views.launch.Splash(root.next)
    info = basic_info.Information(individual, root.next)
    summary = views.more_info.Summary(individual, root.next)

    root.add_child(splash)
    root.add_child(info)
    root.add_child(summary)

    root.start()
    root.show()

    app.processEvents()

    sys.exit(app.exec_())


main()

信息

#!/usr/bin/python3

from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
from PyQt5.QtGui import *


class Information(QWidget):
    def __init__(self, individual, rt):
        QWidget.__init__(self)
        self.setLayout(self.build(individual, rt))
        self.setFixedHeight(200)

    def firstname(self):
        fname_box = QHBoxLayout()
        fname_label = QLabel("What's your first name?")
        self.__fname_input = QLineEdit()
        fname_box.addStretch(1)
        fname_box.addWidget(fname_label)
        fname_box.addStretch(2)
        fname_box.addWidget(self.__fname_input)

        return fname_box

    def lastname(self):
        lname_box = QHBoxLayout()
        lname_label = QLabel("What's your last name?")
        self.__lname_input = QLineEdit()
        lname_box.addStretch(1)
        lname_box.addWidget(lname_label)
        lname_box.addStretch(2)
        lname_box.addWidget(self.__lname_input)

        return lname_box

    def build(self, individual, rt):
        note = QLabel("Let's start off with some basic information.")

        submit = QPushButton()
        submit.setText("Next!")
        submit.clicked.connect(lambda: self.next_op(individual, rt))

        vbox = QVBoxLayout()
        vbox.addStretch(1)
        vbox.addWidget(note)
        vbox.addStretch(2)
        vbox.addLayout(self.firstname())
        vbox.addStretch(3)
        vbox.addLayout(self.lastname())
        vbox.addStretch(4)
        vbox.addWidget(submit)

        return vbox

    def next_op(self, individual, rt):
        if self.__fname_input.text() != "" or self.__lname_input.text() != "":
            individual.firstname = self.__fname_input.text()
            individual.lastname = self.__lname_input.text()
            rt()

总结:

#!/usr/bin/python3

from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
from PyQt5.QtGui import *


class Summary(QWidget):
    def __init__(self, individual, rt):
        QWidget.__init__(self)
        self.setLayout(self.build(individual, rt))
        note = QLabel("This is what you have so far:")
        fname = QLabel("First name = {}".format(individual.firstname))
        lname = QLabel("First name = {}".format(individual.lastname))
        
        vbox = QVBoxLayout()
        vbox.addStretch(1)
        vbox.addWidget(note)
        vbox.addStretch(2)
        vbox.addWidget(fname)
        vbox.addStretch(3)
        vbox.addWidget(lname)

        return vbox

个人:

#!/usr/bin/python3


class Individual:
    def __init__(self):
        self.__first_name = ""
        self.__last_name = ""

    @property
    def firstname(self):
        return self.__first_name

    @firstname.setter
    def firstname(self, fname):
        self.__first_name = fname

    @property
    def lastname(self):
        return self.__last_name

    @lastname.setter
    def lastname(self, lname):
        self.__last_name = lname

    def __str__(self):
        return "First name: {}, Last name: {}".format(self.firstname, self.lastname)

先创建Summary,然后传给Information。然后next_op()可以通知Summary更新它的标签。

class Information(QWidget):
    def __init__(self, individual, rt, summary):
        QWidget.__init__(self)
        self.setLayout(self.build(individual, rt))
        self.setFixedHeight(200)
        self.summary = summary

    ...

    def next_op(self, individual, rt):
        if self.__fname_input.text() != "" or self.__lname_input.text() != "":
            individual.firstname = self.__fname_input.text()
            individual.lastname = self.__lname_input.text()
            self.summary.update_labels(individual)
            rt()
class Summary:
    def __init__(self, individual, rt):
        QWidget.__init__(self)
        self.setLayout(self.build(individual, rt))
        note = QLabel("This is what you have so far:")
        self.fname = QLabel("First name = {}".format(individual.firstname))
        self.lname = QLabel("Last name = {}".format(individual.lastname))
        
        vbox = QVBoxLayout()
        vbox.addStretch(1)
        vbox.addWidget(note)
        vbox.addStretch(2)
        vbox.addWidget(self.fname)
        vbox.addStretch(3)
        vbox.addWidget(self.lname)

        return vbox

    def update_labels(self, individual):
        self.fname.setText("First name = {}".format(individual.firstname))
        self.lname.setText("Last name = {}".format(individual.lastname))