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


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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM