![](/img/trans.png)
[英]How to move tkinter windows using python after it has been created?
[英]How to import QtWebEngineWidgets after QApplication has been created
我正在嘗試解決此錯誤:
QtWebEngineWidgets 必須在創建 QCoreApplication 實例之前導入。
這是不言自明的,但我正在嘗試制作一個可在 iPython 中使用的 GUI,它可以在創建 QApplication 實例后導入。
我怎樣才能解決這個錯誤並創建一個 PyQt5 GUI,它可以顯示 HTML 頁面,並且即使在用戶使用了 QApplication 實例(例如通過 matplotlib)之后也可以導入?
我試過這個,但仍然得到同樣的錯誤:
from PyQt5 import QtWidgets
import seaborn as sns
sns.boxplot([1],[1])
QtWidgets.QApplication.instance().quit()
from PyQt5 import QtWidgets, QtWebEngineWidgets
有一個 hack 可以解決這個問題,但它可能並不完全健壯。
想法是刪除對QApplication
(如果存在)的所有 C++ 引用,以便可以安全地導入 web-engine 模塊。 這可以使用sip來完成,但有一些警告:如果第三方模塊保存了對舊QApplication
的python引用,然后嘗試使用它,它將引發如下錯誤:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: wrapped C/C++ object of type QApplication has been deleted
在實踐中,很難預測這種情況發生的可能性有多大,因為您無法就其他 Python 庫的編寫方式進行立法。 下面腳本中的webengine_hack
函數試圖盡可能減少上述問題的可能性:
def webengine_hack():
from PyQt5 import QtWidgets
app = QtWidgets.QApplication.instance()
if app is not None:
import sip
app.quit()
sip.delete(app)
import sys
from PyQt5 import QtCore, QtWebEngineWidgets
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_ShareOpenGLContexts)
app = QtWidgets.qApp = QtWidgets.QApplication(sys.argv)
return app
try:
# just for testing
from PyQt5 import QtWidgets
app = QtWidgets.QApplication([''])
from PyQt5 import QtWebEngineWidgets
except ImportError as exception:
print('\nRetrying webengine import...')
app = webengine_hack()
from PyQt5 import QtWebEngineWidgets
view = QtWebEngineWidgets.QWebEngineView()
view.setHtml('<h1>Hello World</h1>')
view.show()
app.exec()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.