如何修复 "Attribute Qt::AA_EnableHighDpiScaling must be set before QCoreApplication is created." 警告

12
每次我尝试使用Matplotlib绘制任何图形时,都会出现警告。

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

有人知道如何解决吗?
我尝试通过Google搜索与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()

2
这个问题应该通过 #14566 得到解决。您使用的是哪个版本的 matplotlib?您是在 IPython 中运行此代码还是作为脚本运行? - ImportanceOfBeingErnest
1
这个[升级到Matplotlib 3.1.1]解决了问题。谢谢。 - rkj
3个回答

10

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

pip uninstall matplotlib

然后,使用以下命令安装最新版本:

pip install matplotlib

5
或者简单地运行命令 pip install -U matplotlib-U--upgrade 的缩写)。 - Falcon

6

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

你需要像这样做(以C++为参考,但在Python中相同):

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

0

我意识到这个帖子已经沉寂了一段时间,但是为了像我这样被困在 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库,但这对我来说已经足够好了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接