每当我尝试使用 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库,但这对我来说已经足够了。