通过单击窗口 B 上的按钮关闭窗口 A
Posted
技术标签:
【中文标题】通过单击窗口 B 上的按钮关闭窗口 A【英文标题】:Close window A by clicking a button on window B 【发布时间】:2021-04-18 10:42:02 【问题描述】:我有一个带有一些图表和一个按钮“NEXT”的窗口 A。当用户按下按钮时,窗口 B 会打开,其中包含关于窗口 A 上的图形的一些问题。它还有一个“完成”按钮。一旦按下“完成”,窗口 A 和 B 就会关闭。
问题:我没有关闭窗口 A,控制台中也没有错误消息。
窗口 A:
class Window_A(QDialog):
def __init__(self, parent = None):
super(Window_A, self).__init__(parent,flags=Qt.WindowMinimizeButtonHint|Qt.WindowCloseButtonHint)
self.setWindowTitle("Window A")
self.initUI()
def initUI(self):
# Load the images
[...]
#"NEXT button"
self.b_next = QPushButton("NEXT")
self.b_next.clicked.connect(self.open_next)
#Layout
[...]
def close_win(self):
self.close()
def open_next(self):
self.next= Window_B()
self.next.show()
窗口 B:
class Window_B(QDialog):
def __init__(self):
super(Window_B, self).__init__()
self.setWindowTitle("Window_B")
self.initUI()
def initUI(self):
#define text labels
[...]
#done button
self.d_button = QPushButton("Done")
self.d_button.clicked.connect(self.on_click)
self.d_button.clicked.connect(lambda:self.close())
#layout for text (questions)
[...]
def on_click(self):
Window_A().close_win()
【问题讨论】:
【参考方案1】:在您的 window_B 代码中,您不知道对正确 window_A 对象的引用。 所以你的线:
def on_click(self):
Window_A().close_win()
创建一个新的 Window_A 对象,立即调用它的 close 函数,并尽快将这个对象作为垃圾回收。
您需要在 B 对象中传递对 A 的引用。 例如:
在 window_A.py 中
def open_next(self):
self.next= Window_B()
self.next.show()
self.next.ref_to_close_father = self
在window_B.py中
def on_click(self):
self.ref_to_close_father.close_win()
这应该会更好(但您的示例无法重现,因此可能存在另一个问题。
顺便说一句,
self.d_button.clicked.connect(lambda:self.close())
可能只是
self.d_button.clicked.connect(self.close)
【讨论】:
引用成功了,谢谢!又学到了新东西。 还值得注意的是Window_A().close_win()
确实不为新实例创建任何引用,甚至在本地范围内也没有。它几乎就像在做list().append('x')
:你没有为新实例分配任何引用,所以无论你用它做什么,只要最后一个函数(close_win()
)返回,它就会被垃圾收集。请考虑在 some 情况下它会起作用(显然,我说的是新实例,而不是关闭现有实例):调用 Window_A(self).show()
将创建对父级的隐式引用,因此将实际显示新窗口。以上是关于通过单击窗口 B 上的按钮关闭窗口 A的主要内容,如果未能解决你的问题,请参考以下文章