GMS 3.4.x DM中的Python在使用matplotlib.pyplot时崩溃:无法找到或加载用于windows的Qt平台插件

2024-04-19 00:59:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我无法让matplotlib.pyplot在GMS3.4下工作。它不断使DM崩溃,并显示以下错误消息

This application failed to start because it could not find or load the Qt platform plugin "windows" in "". Reinstalling the application may fix this problem.

运行此代码时(取自DM帮助文档):

import sys
sys.argv.extend(['-a', ' '])
import numpy as np
import matplotlib.pyplot as plt

t = np.arange( 0.0, 3.0, 0.01)
s1 = np.sin(2 * np.pi * t)
plt.plot(t, s1)
plt.show()

重新安装/修复GMS似乎无法解决问题。我是Python新手,所以我可能错过了一些明显的东西


Tags: 代码文档import消息matplotlibas错误np
3条回答

尽管miile7提供的修复程序发挥了作用,但我还是想提出一个替代解决方案:

正如miile7很好地指出的,全局设置环境变量可能会干扰其他软件,应该避免。要让DM找到Qt平台,可以简单地

复制文件夹

ProgramData\Miniconda3\envs\GMS_VENV_PYTHON\Library\plugins\platforms

Program Files\Gatan

或更具体地说是指DigitalMicrograph.exe的位置

在这里可以找到一个更一般的GMS无关线程:

Changing QT_PLUGIN_PATH in environment variables causes programs to fail

更新:

最好通过执行以下命令(具有管理员权限)来创建连接:

mklink /J "C:\Program Files\Gatan\platforms" "C:\ProgramData\Miniconda3\envs\GMS_VENV_PYTHON\Library\plugins\platforms"

这个问题仍然是通过这种方式解决的,如果您在Miniconda中更新/修改Qt,DM应该仍然可以找到最新版本

我也想在GMS中使用python,结果也出现了同样的错误。这花了我几个小时来找出原因以及如何修复它:

TL;博士

将以下代码另存为start-gatan.bat,并使用此start-gatan.bat文件启动GMS。文件可以放在任何地方。请注意,当GMS处于活动状态时,控制台窗口必须保持打开状态

@echo off

rem
rem File: start-gatan.bat
rem           -

SET QT_PLUGIN_PATH=%ProgramData%\Miniconda3\envs\GMS_VENV_PYTHON\Library\plugins
SET gms_path=%PROGRAMFILES%\Gatan\DigitalMicrograph.exe

echo Starting GMS
echo Do not close this window!

"%gms_path%"

重要注意事项:要显示matplotlib窗口,必须取消选中代码面板页脚中的“在后台线程上执行”复选框!而且它需要相对较长的时间来执行


原因

这既不是GMS错误,也不是python错误,而是Qt错误。对于渲染窗口matplotlib(默认情况下)使用PyQT,它使用Qt。该错误说明了qwindows.dll的情况,并且无法(显式地)找到它

旁注The renderer can be changed加入例如matplotlib.use('GTK3Agg')。这不再显示Qt-错误,而是显示另一个错误,所以我没有遵循这个想法

解决方案

qwindows.dll位于%ProgramData%/Miniconda3/envs/GMS_VENV_PYTHON/Library/plugins/platforms。平台插件的路径可以是set in the ^{}(但这并没有为我修复它,in this thread they mention that there may be differences),或者在环境变量%QT_PLUGIN_PATH%中作为I found here

因此添加(创建)系统变量%QT_PLUGIN_PATH%,其值为%ProgramData%\Miniconda3\envs\GMS_VENV_PYTHON\Library\plugins。Windows中的系统变量可以添加到控制面板下系统>高级系统设置>环境变量1

请注意,此环境变量仅适用于GMS,而不适用于所有其他QT程序。因此,创建一个start-gatan.bat并复制TL顶部的代码后缀;博士组。现在双击start-gatan.bat启动GMS,您的示例代码就可以运行了

重要注意事项:要显示matplotlib窗口,必须取消选中代码面板页脚中的“在后台线程上执行”复选框,否则绘图窗口将不可见

1添加一个新的环境变量是可行的,但是如果您有另一个使用QT的程序(这很可能是原因),您将在另一个程序中遇到(几乎)相同的错误消息。如果您只有使用QT的GMSpyqt,这可能是您的解决方案

进一步说明

几个论坛线程including the QT forum讲述了此qwindows.dll的重复路径。如果我的回答对你没有帮助,你可能想调查一下。请注意,必须在miniconda环境中检查环境变量。所以一定要跑

activate GMS_VENV_PYTHON

在输出变量之前。另外,您可能希望查看qt配置,可以在%PROGRAMDATA%/Miniconda3/envs/GMS_VENV_PYTHON/bin找到它。请注意,在正常的Miniconda目录(%PROGRAMDATA%/Miniconda3/bin)和envs中总是有一个文件

使MatplotLib在GMS中运行的测试方法
(使用GMS 3.4.1.2938测试版进行测试)

  • 从干净的系统开始(没有安装GMS,没有安装用于GMS Miniconda的Python)
  • 在启用安装程序和Python选项的情况下安装GMS
  • 使用管理员权限启动Anaconda提示符(右键单击“开始”菜单中的项目)
    Start the Anaconda-prompt with administrator rights
  • 通过键入activate GMS_VENV_PYTHON激活GMS\u VENV\u PYTHON环境
  • 使用pip安装程序通过键入pip install Matplotlib(需要internet连接)安装Matplotlib
  • 启动DigitalMicrograph并运行以下测试脚本:
# This is a PYTHON script to be run in DigitalMicrograph
if ( False == DM.IsScriptOnMainThread() ):
    print( ' MatplotLib scripts require to be run on the main thread.' )
    exit()

import sys
sys.argv.extend(['-a', ' '])
import matplotlib.pyplot as plt
import numpy as np
a = np.linspace(0, 10, 100)
b = np.exp(-a)
plt.plot(a, b)

DM.ClearResults()
print('Start plotting. Script continues when figure is closed')
plt.show()
print('Done plotting.')

Result

另外,因为这是关于DM脚本的:使用混合脚本的功能,可以将Python调用包装成字符串,并直接从DM脚本中执行它:

// This is a DM-script
string pyScript
pyScript += "import sys" + "\n"
pyScript += "sys.argv.extend(['-a', ' '])" + "\n"
pyScript += "import matplotlib.pyplot as plt" + "\n"
pyScript += "import numpy as np" + "\n"
pyScript += "a = np.linspace(0, 10, 100)" + "\n"
pyScript += "b = np.exp(-a)" + "\n"
pyScript += "plt.plot(a, b)" + "\n"
pyScript += "plt.show()" + "\n"

ClearResults()
Result( "Script continues when figure is closed\n" )
ExecutePythonScriptString( pyScript, 1 ) // On Main-thread
Result( "Done plotting.\n" )

相关问题 更多 >