1 回答

TA貢獻1839條經驗 獲得超15個贊
解釋:
要了解問題,必須分析以下 2 個代碼及其輸出:
示例1
from PyQt5 import QtCore
if __name__ == "__main__":
app = QtCore.QCoreApplication([])
o = QtCore.QObject()
o.destroyed.connect(lambda: print("destroyed o"))
o = QtCore.QObject()
def on_timeout():
print("quit")
QtCore.QCoreApplication.quit()
QtCore.QTimer.singleShot(1000, on_timeout)
app.exec_()
destroyed o
quit
示例 2
from PyQt5 import QtCore
if __name__ == "__main__":
app = QtCore.QCoreApplication([])
o = QtCore.QObject()
o.destroyed.connect(lambda: print("destroyed o"))
p = o
o = QtCore.QObject()
def on_timeout():
print("quit")
QtCore.QCoreApplication.quit()
QtCore.QTimer.singleShot(1000, on_timeout)
app.exec_()
quit
destroyed o
在第一個示例中,變量“o”被分配了一個QObject,當另一個QObject被分配時,初始QObject被刪除,因此在“退出”之前打印“銷毀”。
在第二個示例中,它具有差異“p = o”,其中引用QObject,也就是說,在該行中“p”和“o”表示相同的對象,因此通過分配“或”一個新的QObject,初始QObject不會被破壞,并且只有在循環結束時并且GC完成其工作時才被銷毀。
這就是在你的情況下以一種微妙的方式發生的事情,“p = o”的邏輯是QObject存儲在另一個“地方”,而在你的例子中,“地方”是具有自己作用域的lambda(類似于部分)。具體來說,在您的示例中,創建了一個新窗口,銷毀了前一個窗口,從而導致始終顯示單個窗口。
溶液:
一種可能的解決方案是防止刪除第一個窗口并使用標志創建新窗口:
from PyQt5 import QtCore, QtGui, QtWidgets
flag = False
# ...
def open_otherwindow():
global w, flag
if not flag:
w = OtherWindow()
w.show()
flag = True
# ...
添加回答
舉報