【问题标题】:How to fix: "Attribute Qt::AA_EnableHighDpiScaling must be set before QCoreApplication is created." warning如何解决:“必须在创建 QCoreApplication 之前设置属性 Qt::AA_EnableHighDpiScaling。”警告
【发布时间】:2019-08-12 07:30:48
【问题描述】:

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

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

有人知道怎么解决吗?

尝试在 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()

【问题讨论】:

  • 应该由#14566修复。您使用的是哪个版本的 matplotlib?您是在 IPython 中运行此代码还是作为脚本运行?
  • this [升级到 Matplotlib 3.1.1] 解决了这个问题。谢谢

标签: python qt matplotlib


【解决方案1】:

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

pip uninstall matplotlib

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

pip install matplotlib

【讨论】:

  • 或者简单地说pip install -U matplotlib-U--upgrade的简写)
【解决方案2】:

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

你需要做类似(c++ as ref 但在 python 中是一样的):

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      相关资源
      最近更新 更多