最近更新于 2025-12-03 17:11
前言
2025/12/3
Python 的 Tkinter 图形库底层是用的 TCL/TK 实现。
NX 内嵌的 Python 是带有 TCL/TK 的 dll 引擎文件的,但是没有 TCL/TK 库文件,也就是为什么报错:This probably means that Tcl wasn’t installed properly.
Python 认为你没有安装 TCL/TK,不过 NX 的制造模块也会使用 TCL/TK 库,它就携带了库文件。只是在 NX 2506 中内嵌 Python 携带的 TCL/TK 的 dll 文件是 8.6.15 版本的,而制造模块携带的 TCL/TK 是 8.6.9 的,因此需要修改 TCL/TK 库让它检查版本时允许用 8.6.15 版本的引擎。
修改 TCL/TK 库版本检查
以管理员身份打开记事本。
用记事本编辑 %UGII_BASE_DIR%\MACH\auxiliary\tcl\library\tcl8.6.9 下的 init.tcl 文件

将 19 行要求 8.6.9 改为 8.6.15
package require -exact Tcl 8.6.15

用记事本编辑 %UGII_BASE_DIR%\MACH\auxiliary\tcl\library\tk8.6.9 下的 tk.tcl 文件
将 14 行要求 8.6.9 改为 8.6.15
package require -exact Tk 8.6.15

环境变量
①要么修改 Windows 的环境变量设置,新建 TCL_LIBRARY 和 TK_LIBRARY,把制造模块的 TCL/TK 库路径添加进去,就是上面修改的两个文件所在的路径,分别就是 TCL 和 TK 库路径。
②另外一种方案就是在使用 Tkinter 的代码中嵌入下面代码,在当前代码中临时添加 TCL 和 TK 的环境变量
import os
NX_PATH = os.getenv('UGII_BASE_DIR')
TCL_PATH = os.path.join(NX_PATH, r'MACH\auxiliary\tcl\library', 'tcl8.6.9')
TK_PATH = os.path.join(NX_PATH, r'MACH\auxiliary\tcl\library', 'tk8.6.9')
os.environ["TCL_LIBRARY"] = TCL_PATH
os.environ["TK_LIBRARY"] = TK_PATH
测试
下面是一段完整的测试代码
import os
NX_PATH = os.getenv('UGII_BASE_DIR')
TCL_PATH = os.path.join(NX_PATH, r'MACH\auxiliary\tcl\library', 'tcl8.6.9')
TK_PATH = os.path.join(NX_PATH, r'MACH\auxiliary\tcl\library', 'tk8.6.9')
os.environ["TCL_LIBRARY"] = TCL_PATH
os.environ["TK_LIBRARY"] = TK_PATH
""""
Tkinter 示例程序
"""
import tkinter as tk
from tkinter import messagebox
def on_click():
messagebox.showinfo("提示", "按钮被点击了!")
root = tk.Tk()
root.title("最简 Tkinter 示例")
root.geometry("300x150")
btn = tk.Button(root, text="点我", command=on_click)
btn.pack(expand=True)
root.mainloop()
使用 NX 运行,Tkinter 正常工作

注意
当然我不知道这样会不会影响制造模块的功能,有可能会导致制造模块无法使用。我更建议的是自己安装完全功能的 Python,和 NX 内嵌版本一致,这样就可以保证 Tkinter 正常工作。参考:https://blog.iyatt.com/?p=22307
可以把自己安装的 Python 中的 tcl 目录附带到项目中,以实现迁移到其它电脑可以通用,不需要再配置环境,比如我这里的一个 NX Python 项目:https://github.com/IYATT-yx/NX-batch-PDF-exporter
NX 2506 的 Python 版本是 3.12.8,我自己安装的 3.12.10,然后把自己安装的 Python 中的 tcl 目录复制到项目目录中,随项目一起发布

然后在项目代码中开始使用 tkinter 前的代码中设置 TCL 路径,这样 tkinter 就可以正常工作。

