Python 是否在关闭窗口(不是子窗口)后执行函数?
我的应用程序中有一个按钮,单击该按钮后会打开另一个窗口(这是一个单独的python文件) 我想在第二个窗口关闭后执行一个函数。有什么方法可以捕捉到窗户的“关闭”信号或类似的东西吗 这是我的代码:(主窗口) 下面是第二个窗口的代码:Python 是否在关闭窗口(不是子窗口)后执行函数?,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我的应用程序中有一个按钮,单击该按钮后会打开另一个窗口(这是一个单独的python文件) 我想在第二个窗口关闭后执行一个函数。有什么方法可以捕捉到窗户的“关闭”信号或类似的东西吗 这是我的代码:(主窗口) 下面是第二个窗口的代码: from PyQt5 import QtWidgets from PyQt5.QtCore import Qt from PyQt5.QtGui import QPainter, QColor from PyQt5.QtWidgets import QA
from PyQt5 import QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPainter, QColor
from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QVBoxLayout
from PyQt5.QtWidgets import QPushButton
import first_window
from sys import exit as sysExit
class Marker(QWidget):
def __init__(self):
QWidget.__init__(self)
self.resize(350, 250)
self.openbtn = QPushButton('close')
self.openbtn.clicked.connect(self.Close)
HBox = QHBoxLayout()
HBox.addWidget(self.openbtn)
HBox.addStretch(1)
VBox = QVBoxLayout()
VBox.addLayout(HBox)
VBox.addStretch(1)
self.setLayout(VBox)
def Close(self):
TEST_draggable.Marker.do_something(first_window.Marker)
self.close()
def paintEvent(self, event):
p = QPainter(self)
p.fillRect(self.rect(), QColor(128, 128, 128, 128))
if __name__ == "__main__":
MainEventThred = QApplication([])
MainApp = Marker()
MainApp.show()
MainEventThred.exec()
代码未运行并引发以下错误:
Traceback (most recent call last):
File "some/path/second_dialog.py", line 28, in Close
TEST_draggable.Marker.do_something(first_window.Marker)
File "some/path/first_window.py", line 39, in do_something
self.label_1.setText("clicked")
AttributeError: type object 'Marker' has no attribute 'label_1'
[1] 7552 abort (core dumped) /usr/local/bin/python3
我怎样才能解决这个问题?我查阅了很多论坛,怀疑循环进口是罪魁祸首,但我不确定。请提供帮助。问题与导入无关,而是与您试图在类上运行实例方法有关 “罪魁祸首”是:
first\u窗口。Marker
将用于do\u something
中的self
参数,但由于它是类,因此没有label\u 1
属性(只有该类的实例具有该属性)。我建议您研究类和实例的工作原理,以及如何在Python中处理它们
最简单的解决方案是为第二个窗口创建自己的信号,并将该信号连接到将“做某事”的函数上。然后,我们不再连接到新函数,而是将子类化并从中发送信号,这样即使用户单击标题栏上的专用按钮,我们也可以捕获关闭。请注意,如果要更改close
的行为,只需重写它,然后调用基本实现(super().close()
),而不是使用另一个函数名(顺便说一下,函数名不应大写,因为它们只应用于类和常量)
这是第二节课;请注意,为不同的类使用相同的名称是一个非常糟糕的主意
from PyQt5.QtCore import pyqtSignal
class Marker(QWidget):
closed = pyqtSignal()
def __init__(self):
QWidget.__init__(self)
self.resize(350, 250)
self.openbtn = QPushButton('close')
self.openbtn.clicked.connect(self.close)
# ...
def closeEvent(self, event):
self.closed.emit()
TEST_draggable.Marker.do_something(first_window.Marker)
from PyQt5.QtCore import pyqtSignal
class Marker(QWidget):
closed = pyqtSignal()
def __init__(self):
QWidget.__init__(self)
self.resize(350, 250)
self.openbtn = QPushButton('close')
self.openbtn.clicked.connect(self.close)
# ...
def closeEvent(self, event):
self.closed.emit()
class Marker(QWidget):
# ...
def open_dialog(self):
self.dialog = QtWidgets.QWidget()
self.box = second_dialog.Marker()
self.box.closed.connect(self.do_something)
self.box.show()