gpt4 book ai didi

python - 在 PyQt5 中将数据从子窗口发送到父窗口

转载 作者:太空宇宙 更新时间:2023-11-04 00:00:42 26 4
gpt4 key购买 nike

我不能做什么

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

我有什么

我有一个复杂的 GUI,其中有几个窗口向子窗口发送数据。每个窗口代表同一目录中的唯一 Python 脚本。无需明确指定 parent 和 child ,因为通信始终是单向的( parent 对 child )。但是,现在我需要将数据从 child 发送回 parent ,并且无法弄清楚如何做到这一点,因为每个窗口(即每个类(class))都有自己的文件。

例子

这是一个最简单的示例,展示了我想要完成的任务的基础。它的作用:win01 打开 win02 并且 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总是报错:RecursionError:超出最大递归深度。

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

  • 不在 win02 中导入 testfile01 并将 parent=None 调整为不同的其他对象
  • win02__init__ 调用中导入 testfile01
  • win02 中创建信号以触发 win01 中的 func

问题

是否有解决方案如何从 win02 正确触发 win01 中的 func

最佳答案

为什么会出现RecursionError: maximum recursion depth exceeded

你得到它是因为你有一个生成无限循环的循环导入,在 testfile01 中你正在导入文件 testfile02,而在 testfile02 中你正在导入 testfile01,....所以这是一个糟糕设计的展示。


Qt 为对象提供信号机制以将信息传递给其他对象,这具有类之间非依赖性的优势,这是一个巨大的长期利益(例如避免循环导入),因此对于我认为最合适的原因。

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

testfile01.py

import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QApplication
import testfile02 as t02


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

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

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.QtCore import pyqtSignal
from PyQt5.QtWidgets import QWidget, QPushButton, QVBoxLayout


class win02(QWidget):
clicked = pyqtSignal()

def __init__(self, parent=None):
super(win02, self).__init__(parent)
self.button = QPushButton("call to func")
self.button.clicked.connect(self.clicked)
lay = QVBoxLayout(self)
lay.addWidget(self.button)

我建议你阅读:

关于python - 在 PyQt5 中将数据从子窗口发送到父窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55831889/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com