|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 Notodontidae 于 2024-7-13 16:11 编辑
如果将两个py的两个class同事放置于一个.py中,则在使用self时不会被__del__回收,但是分别放置到不同的.py里就会闪退
求教,除了使用global全局变量之外没有别的方法了吗?
第一个窗口ui(first_wind.py):
- from PyQt5 import QtCore, QtGui, QtWidgets
- class Ui_Dialog(object):
- def setupUi(self, Dialog):
- Dialog.setObjectName("Dialog")
- Dialog.resize(1080, 720)
- self.main_widget=QtWidgets.QWidget(Dialog)
- self.main_widget.setObjectName("mainwidget")
- self.test_button=QtWidgets.QPushButton(Dialog)
- self.test_button.setGeometry(QtCore.QRect(200,200,200,50))
- self.test_button.setText('dundun')
-
- self.retranslateUi(Dialog)
- QtCore.QMetaObject.connectSlotsByName(Dialog)
- def retranslateUi(self, Dialog):
- _translate = QtCore.QCoreApplication.translate
- Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
复制代码
第一个窗口事件:(first_wind_act.py):
- import sys
- import first_wind
- import sec_wind
- import time
- from PyQt5 import QtCore,QtGui,QtWidgets
- from PIL import Image
- sys.path.append(r'G:\\pythoncodes\\qt5')
- class FirstWindowAct(first_wind.Ui_Dialog,QtWidgets.QMainWindow):
- def __init__(self):
- super(first_wind.Ui_Dialog, self).__init__()
- self.setupUi(self)
- self.test_button.clicked.connect(self.opn_btn_clicked)
- self.sec_wind=None
- def opn_btn_clicked(self):
- self.close()
- self.sec_wind=sec_wind.SecWindowAct() #sec_wind中要调用的class,点击之后就闪退,不知道为什么会这样
- self.sec_wind.show()
- time.sleep(5)
- if __name__=='__main__':
- app = QtWidgets.QApplication(sys.argv)
- root=FirstWindowAct()
- root.show()
- sys.exit(app.exec_())
复制代码
第二个窗口ui:略,除了没有QPushButton以外,其余之处和第一个窗口的结构完全一致
第二个窗口事件:(sec_wind_act.py):
- import sys
- import sec_wind
- from PyQt5 import QtCore,QtGui,QtWidgets
- from PIL import Image
- sys.path.append(r'G:\\pythoncodes\\qt5')
- class SecWindowAct(sec_wind.Ui_Dialog,QtWidgets.QMainWindow):
- def __init__(self):
- super(sec_wind.Ui_Dialog,self).__init__()
- self.setupUi(self)
复制代码
错误的super调用:
在FirstWindowAct和SecWindowAct的构造函数中,你错误地调用了super。你应该使用当前类名作为第一个参数,而不是Ui_Dialog(它不是一个QMainWindow的子类)。这会导致构造函数没有正确初始化QMainWindow的部分,可能导致程序行为异常。
修改前:
- super(first_wind.Ui_Dialog, self).__init__()
复制代码
修改后:
- super(FirstWindowAct, self).__init__()
- 同样,对于SecWindowAct也做相同的修改。
复制代码
错误的窗口设置:
在Ui_Dialog类中,你尝试将main_widget和test_button添加到Dialog上,但实际上你应该将它们添加到self.main_widget上(如果你打算在QMainWindow中使用中央小部件的话)。不过,因为你直接继承自QMainWindow,你可能不需要main_widget,除非你有特定的布局需求。
__del__方法的误解:
在Python中,__del__方法(如果定义了)是在对象被垃圾回收时调用的。但是,Python的垃圾回收是不确定的,且依赖于对象的引用计数和循环引用检测。在你的情况下,self的回收与类定义在哪个文件中无关,而是与对象的引用和使用情况有关。
程序结构:
你的程序结构看起来有些混乱,特别是关于如何组织和导入模块。通常,UI类和相关的逻辑应该分开,并且每个窗口的UI和逻辑应该在同一个模块或包中。
示例
- # first_wind_act.py
- import sys
- from PyQt5 import QtWidgets
- from first_wind import Ui_Dialog
-
- class FirstWindowAct(QtWidgets.QMainWindow):
- def __init__(self):
- super(FirstWindowAct, self).__init__()
- self.ui = Ui_Dialog()
- self.ui.setupUi(self) # 将self(QMainWindow实例)传递给setupUi
-
- self.ui.test_button.clicked.connect(self.opn_btn_clicked)
- self.sec_wind = None
-
- def opn_btn_clicked(self):
- self.close()
- from sec_wind_act import SecWindowAct
- self.sec_wind = SecWindowAct()
- self.sec_wind.show()
-
- if __name__ == '__main__':
- app = QtWidgets.QApplication(sys.argv)
- root = FirstWindowAct()
- root.show()
- sys.exit(app.exec_())
复制代码
|
|