Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在PyQt5中将数据从子窗口发送到父窗口 我不能做什么_Python_Pyqt - Fatal编程技术网

Python 在PyQt5中将数据从子窗口发送到父窗口 我不能做什么

Python 在PyQt5中将数据从子窗口发送到父窗口 我不能做什么,python,pyqt,Python,Pyqt,我无法将数据从子窗口发送回父窗口 我所拥有的 我有一个带有多个窗口的复杂GUI,可以将数据发送到子窗口。每个窗口在同一目录中表示一个唯一的Python脚本。没有必要明确指定父母和孩子,因为交流总是单向的(父母对孩子)。然而,现在我需要将数据从child发送回父母,但我不知道如何做,因为每个窗口(即每个类)都有自己的文件 例子 下面是一个简单的例子,展示了我想要实现的目标的基础。 它的作用:win01打开win02,并在win01中触发func # testfile01.py import sy

我无法将数据从子窗口发送回父窗口

我所拥有的 我有一个带有多个窗口的复杂GUI,可以将数据发送到子窗口。每个窗口在同一目录中表示一个唯一的Python脚本。没有必要明确指定父母和孩子,因为交流总是单向的(父母对孩子)。然而,现在我需要将数据从child发送回父母,但我不知道如何做,因为每个窗口(即每个类)都有自己的文件

例子 下面是一个简单的例子,展示了我想要实现的目标的基础。 它的作用:
win01
打开
win02
,并在
win01
中触发
func

# testfile01.py

import sys
from PyQt5.QtWidgets import *
import testfile02 as t02

class win01(QWidget):

    def __init__(self, parent=None):
        super(win01, self).__init__(parent)

        self.win02 = t02.win02()
        self.button = QPushButton("open win02", self)
        self.button.move(100, 100)
        self.button.clicked.connect(self.show_t02)

    def initUI(self):
        self.center

    def show_t02(self):
        self.win02.show()

    def func(self):
        print("yes!")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = win01()
    ex.show()
    sys.exit(app.exec_())

##########################################################################

# testfile02.py

from PyQt5.QtWidgets import *
import testfile01 as t01

class win02(QWidget):

    def __init__(self, parent=None):
        super(win02, self).__init__(parent)

        self.win01 = t01.win01()
        self.button = QPushButton()
        self.button.clicked.connect(self.win01.func)

    def initUI(self):
        self.center()
我试过的 在第二个窗口中导入testfile01始终会导致错误:
递归错误:超过最大递归深度。

然后,我尝试了以下方法,但它们也不起作用:

  • 不在
    win02
    中导入testfile01,并将
    parent=None
    调整到不同的其他对象
  • win02
  • win02
    中创建信号以触发
    win01
    中的
    func
问题
是否有一种解决方案可以从
win02
正确触发
win01
中的
func

这两个小部件都是独立的,它们之间没有链接。 设置win02的win01父级

在win01类中
替换:

self.win01 = t02.win02()
#and
self.win02.show()
与:

并且在win02类中
替换:

与:

为什么会出现递归错误:超过最大递归深度

之所以得到它,是因为您有一个生成无限循环的循环导入,在testfile01中导入文件testfile02,在testfile02中导入testfile01。。。。所以这是一个糟糕设计的表现


Qt为对象提供了信号机制,以便将信息传递给其他对象,这具有类之间不依赖的优点,这是一个巨大的长期好处(例如,避免循环导入),因此我认为它是最合适的

为此,我将在win02类中创建由按钮的单击信号触发的单击信号,并使该单击信号调用func:

testfile01.py

导入系统 从PyQt5.QtWidgets导入QWidget、QPushButton、QApplication 将testfile02导入为t02 类win01(QWidget): def uuu init uuu(self,parent=None): 超级(win01,self)。\u初始化\u(父级) self.win02=t02.win02() self.win02.clicked.connect(self.func) self.button=QPushButton(“打开win02”,self) 自动按钮移动(100100) self.button.clicked.connect(self.show_t02) def显示_t02(自身): self.win02.show() def func(自我): 打印(“是!”) 如果名称=“\uuuuu main\uuuuuuuu”: app=QApplication(sys.argv) ex=win01() 例如:show() sys.exit(app.exec_()) testfile02.py

从PyQt5.QtCore导入pyqtSignal
从PyQt5.QtWidgets导入QWidget、QPushButton、QVBoxLayout
win02类(QWidget):
单击=pyqtSignal()
def uuu init uuu(self,parent=None):
超级(win02,self)。\uuuuu初始化\uuuuuu(父级)
self.button=QPushButton(“调用func”)
self.button.clicked.connect(self.clicked)
lay=QVBoxLayout(自身)
lay.addWidget(self.button)

我建议你阅读:


差不多了。现在我得到:
AttributeError:“win02”对象没有属性“win01”
这是因为您在两个类中都输入了错误的win01和win02,让我更新我的答案,如果有帮助,请确保投赞成票。您是对的!我现在更新了输入错误(对不起,您可能需要再次更新您的答案)。有趣的是,win01会打开,但按钮不会打开win02。好的,谢谢,这很有意义。现在几乎所有的东西都能用了。第二个窗口打开。但是,单击按钮不会从win01链接到func。我想win02中可能缺少类似于
self.clicked.connect(self.parent().func)
的东西来完成连接(不幸的是,这不起作用)。@alex_555您指出的是一个糟糕的设计,其思想是类不是相互交织,而是对象。为什么这是一个糟糕的设计?因为如果类相互交织在一起,那么维护就更复杂了,因为如果修改win01类,您可能需要修改win02类,这显然不是我们的想法,所以Qt提供了透明的信号。@alex_555您读过单一责任原则吗?这表明每个类都必须有一个已定义的任务,在win02的情况下,它的职责是通知按钮已按下,win01的职责是将通知连接到将要执行的方法invoked@alex_555我建议您在实现类之前先设计它们,这样可以避免这些问题。在Qt中,建议通过信号通知外部元件的内部变化,因为这种方式我们实现了封装原则,并且只显示必要的信息谢谢!这是非常有用的。现在我开始工作了。我完全理解你设计糟糕的意思。谢谢!这确实有助于改进我的代码。
self.win01 = t02.win02(self)
#and
self.win01.show()
self.win02 = t01.win01()
#and
self.button.clicked.connect(self.win01.func)
self.win02 = self.parent()
#and
self.button.clicked.connect(self.win02.func)