相关文章推荐
强悍的水煮肉  ·  PyQt5 ...·  2 天前    · 
难过的水煮鱼  ·  Fiddler实践心得 - 简书·  1 年前    · 
个性的竹笋  ·  java - Netbeans GUI ...·  1 年前    · 

python pyside pyqt reload TypeError: super(type, obj): obj must be an instance or subtype of type

一开始遇到这个问题,在网上找了不少解决方法,这里提供链接仅供参考:https://blog.csdn.net/likesubject/article/details/104472778,https://iwwxiong.com/2019/07/02/python_super_TypeError/

不过都不能从根本上解决我遇到的问题,在我的模块中有一个全局变量,是一个pyqt mainWindow 对象,在reload这个模块后,这个对象会有一个野地址,然后重新reload一个新的,也就是说这个野地址的对象没有被释放,它的一些事件线程还会触发(例如event事件),不过受到这些参考加上之前pyside帮助文档里面看到的关于垃圾回收的问题:

不过网上看到有大神说这个解释是针对C++的,在pyqt中,如果一个widget的parent为None,而这个widget被检测到成为野地址,会自动被回收(链接找不到了)。

然后我抱着尝试的心态,在reload之前,把mainWindow对象的parent设置为None,mainWindow.setParent(None)(突然觉得setParent在python中如此好用),然后reload,果然成功了,事件线程也不再多余的运行,也不会报错,从根本上解决了问题。

我也尝试了del 对象,发现没有用。

以后可以放心的reload了。

但是还有一个问题,如果当前对象在启动的状态下,通过其它方式去reload了当前对象所在的模块,那么也会出现以上的报错,因为所依赖的class被reload了,所以在调用的时候,不要以这种方式:

super(YourClassType, self).event(event)

最好以这种方式:

ParentClassType.event(self,event)

未经博主允许,禁止直接转载本博客任何内容(可以在文章中添加链接,禁止原文照搬),如需直接原文转载对应文章,请在该文章中留言联系博主,谢谢!!