解决方法:"Attribute Qt::AA_EnableHighDpiScaling must be set before QCoreApplication is created."警告



每当我尝试使用 Matplotlib 绘制任何东西时,我都会收到此警告。

属性 Qt::AA_EnableHighDpiScaling 必须在创建 QCoreApplication 之前设置。

有谁知道如何解决它?

尝试在 Matplotlib 中谷歌搜索与 Qt 绑定相关的任何问题 - 仍然无法解决这个问题。

这是一个将产生警告的简单代码

import numpy as np
import matplotlib.pyplot as plt
a = np.arange(1000) # the distribution doesn't matter
plt.hist(a) # here could plt.scatter or plt.plot - would still get same error.
plt.show()

这可以通过将 matplotlib 更新到最新版本来解决。首先,使用以下方法删除旧版本:

pip uninstall matplotlib

然后,使用以下方法安装最新版本:

pip install matplotlib

在QT中,设置应用程序标志时有一些规则,这就是其中之一,

你需要做一些类似的事情(C ++作为ref,但在Python中是相同的(:

//first set the flags
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
//more code and then create the QApplication 
QApplication mainApplication(argc, argv);

我意识到这个线程已经休眠了一段时间,但是为了像我这样被困在 python 2.7 上的人(由于各种原因远远超出这个问题的范围(,执行以下操作也会停止警告: 在 site-packages/matplotlib/backends 下编辑backend_qt5.py文件,然后在 create_qApp(( 函数中,将最后几行 qApp.setAttribute 移动到较早的循环中。原始函数如下所示:

def _create_qApp():
"""
Only one qApp can exist at a time, so check before creating one.
"""
global qApp
if qApp is None:
app = QtWidgets.QApplication.instance()
if app is None:
# check for DISPLAY env variable on X11 build of Qt
if is_pyqt5():
try:
from PyQt5 import QtX11Extras
is_x11_build = True
except ImportError:
is_x11_build = False
else:
is_x11_build = hasattr(QtGui, "QX11Info")
if is_x11_build:
display = os.environ.get('DISPLAY')
if display is None or not re.search(r':d', display):
raise RuntimeError('Invalid DISPLAY variable')
qApp = QtWidgets.QApplication([b"matplotlib"])
qApp.lastWindowClosed.connect(qApp.quit)
else:
qApp = app
if is_pyqt5():
try:
qApp.setAttribute(QtCore.Qt.AA_UseHighDpiPixmaps)
qApp.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
except AttributeError:
pass

编辑后的函数是这样的:

def _create_qApp():
"""
Only one qApp can exist at a time, so check before creating one.
"""
global qApp
if qApp is None:
app = QtWidgets.QApplication.instance()
if app is None:
# check for DISPLAY env variable on X11 build of Qt
if is_pyqt5():
try:
from PyQt5 import QtX11Extras
is_x11_build = True
except ImportError:
is_x11_build = False
try:
qApp.setAttribute(QtCore.Qt.AA_UseHighDpiPixmaps)
qApp.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
except AttributeError:
pass

else:
is_x11_build = hasattr(QtGui, "QX11Info")
if is_x11_build:
display = os.environ.get('DISPLAY')
if display is None or not re.search(r':d', display):
raise RuntimeError('Invalid DISPLAY variable')
qApp = QtWidgets.QApplication([b"matplotlib"])
qApp.lastWindowClosed.connect(qApp.quit)
else:
qApp = app
#if is_pyqt5():
#   try:
#       qApp.setAttribute(QtCore.Qt.AA_UseHighDpiPixmaps)
#       qApp.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
#   except AttributeError:
#       pass

也许有更巧妙的方法来破解matplotlib库,但这对我来说已经足够了。

最新更新