在同一应用程序中导入qgis.core和tkinter时遭遇“No module named '_tkinter'”错误的技术求助
解决同时导入qgis.core与tkinter时出现的ModuleNotFoundError: No module named '_tkinter'问题
我之前也踩过这个一模一样的坑!本质原因很简单:QGIS自带的Python环境是专门为GIS功能定制的,默认没有编译tkinter所需的底层依赖组件。当你把QGIS的Python路径加到环境变量后,系统会优先调用这个定制版Python,而它刚好缺失了_tkinter这个核心库——这就是为什么单独用系统Python时tkinter正常,一沾QGIS的路径就报错。
下面给你几个实用的解决办法,按推荐程度排序:
方案一:用系统默认Python加载QGIS库(最稳妥)
既然系统默认Python本身支持tkinter,那我们反过来操作:让系统Python加载QGIS的核心库,而不是用QGIS的Python跑tkinter。修改你的测试脚本如下:
import os import sys import glob import tkinter # 先导入tkinter,确保用系统Python的环境 # 手动指定QGIS的安装路径 qgis_root = r"C:\Program Files\QGIS 3.20.1" qgis_python_path = os.path.join(qgis_root, "apps", "qgis", "python") qgis_apps_path = os.path.join(qgis_root, "apps") # 添加QGIS核心库路径 sys.path.insert(0, qgis_python_path) # 添加QGIS依赖的其他Python库(比如PyQt5、numpy等) for site_pkg_path in glob.glob(os.path.join(qgis_apps_path, "Python39", "Lib", "site-packages")): sys.path.insert(0, site_pkg_path) # 初始化QGIS环境(这步千万别忘,否则qgis.core无法正常工作) from qgis.core import * QgsApplication.setPrefixPath(os.path.join(qgis_root, "apps", "qgis"), True) qgs_app = QgsApplication([], False) qgs_app.initQgis() # 现在可以同时使用tkinter和QGIS功能了 root = tkinter.Tk() root.title("QGIS + Tkinter 测试") root.mainloop() # 程序退出时清理QGIS资源 qgs_app.exitQgis()
关键说明:
- 先导入tkinter,确保系统优先使用自带的Python环境
- 手动添加QGIS的库路径,而不是依赖全局环境变量,避免干扰其他Python程序
- 必须初始化QGIS应用,否则qgis.core的大部分功能会无法调用
方案二:给QGIS的Python补装tkinter(不推荐)
如果你一定要用QGIS自带的Python运行脚本,那需要给它补上tkinter的依赖:
- 找到QGIS的Python目录:
C:\Program Files\QGIS 3.20.1\apps\Python39 - 下载对应Python 3.9版本、同架构(32/64位)的
_tkinter.pyd文件,以及tkinter的配套库文件 - 将
_tkinter.pyd放到Python39\DLLs目录,把tkinter的库文件放到Python39\Lib\site-packages - 这个方法兼容性风险很高,版本不匹配很容易导致程序崩溃,除非你对Python底层非常熟悉,否则不建议尝试。
方案三:用虚拟环境隔离开发环境(进阶)
适合长期开发的场景,创建一个基于系统Python的虚拟环境,同时加载QGIS的库:
- 用系统Python创建虚拟环境:
python -m venv qgis-tk-env
- 激活虚拟环境:
qgis-tk-env\Scripts\activate
- 在虚拟环境的
Lib\site-packages目录下创建一个qgis_paths.pth文件,内容如下:
C:\Program Files\QGIS 3.20.1\apps\qgis\python C:\Program Files\QGIS 3.20.1\apps\Python39\Lib\site-packages
- 这样虚拟环境里既有完整的tkinter支持,又能调用QGIS的核心功能,还不会干扰全局Python环境。
最后提醒一句:不要把QGIS的Python路径加到系统全局的PYTHONPATH里,否则会覆盖系统默认的Python环境,导致其他依赖tkinter的程序也出现同样的错误。
内容的提问来源于stack exchange,提问作者john_kowalski
相关产品推荐
相关产品推荐

