我一直在努力使图像通过buildroot为乌藨子pi(具体来说,一个CM 4),并与python和tkinter遇到了一点障碍。基本的问题是,我已经尝试包括python以及其他一些内置的python3-packages与构建。其中一些是成功的,但我一直有问题,特别是让tkinter适当地工作。当我在一个python shell,并尝试“import tkinter”会抛出一个回溯错误:
Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
File “/usr/lib/python311/tkinter/__init__.py”, line 38 in <module>
ModuleNotFoundError: No module named ‘_tkinter’
字符串
我理解这个错误本身的意思,但我想弄清楚为什么这个错误没有被包含在构建中。我知道tkinter本身是一个用于访问tk/tcl模块的 Package 器,而不仅仅是一个独立的模块。我也理解python 2 vs python3和“Tk”vs“tk”之间的问题,并且已经验证了这不是问题,我目前使用的是Python3.11。
在互联网上搜索时,我遇到了几个解决方案,并做了一些故障排除来尝试解决问题,但没有一个给了我一个积极的结果,所以这里是我尝试过的一切:
- 我发现默认情况下python(通过buildroot)没有启用tk。我更新了
/packages/python3/python.mk
文件,并将所有--disable tk
语句更改为--enable tk
。构建了一个新的镜像并进行了闪存,仍然无法“导入tkinter”。 - 我另外包含了tcl和tk目标包(分别在“语言解释器”和“图形界面”下)。构建了一个新的镜像并刷新,仍然无法“导入tkinter”。
- 我还添加了python-pip,目的是用pip安装tcl和tk。在安装之前,我运行了“pip list”,并验证了我为构建选择的其他预配置的python模块是否显示。
- 使用
pip install tk
和pip install tcl
,我能够通过pip安装tk和tcl。这样做后,“pip list”应该安装一个适当的修订包。我分别尝试了两者,以及两者一起。构建了一个新的映像并刷新,仍然无法“导入tkinter”。 - 通过额外的搜索,我能够发现其他一些人也遇到了相同/类似的问题,我尝试了几个补丁。我创建了一个全局补丁文件夹并配置了全局补丁目录。该目录是我的buildroot目录的一个级别(外部)。我还将补丁包含在全局补丁目录中的“/python3/”目录中。构建了一个新的映像并闪存,仍然无法“导入tkinter”. Patches 1 and 2Additional patch 3
在所有的变化之后,我有点不知道下一步该看哪里/什么。(没有任何额外的更改)在/usr/..../python3.11/
下有一个tkinter文件夹,其中包含预期的__init__.py
脚本(这是我假设在回调错误中显示的)。如上所述,我所有的其他软件包,我可以在一个python终端像import can
为python-can
使用的一个例外,试图使用from PIL import ImageTk
得到一个类似的错误说:“无法定位_tkinter”.这是预期的,因为特定的库也依赖于tkinter,这只是另一个验证,其他软件包无法找到它。/usr/..../python3.11/tkinter
文件夹的存在让我相信tkinter是用python添加/构建的,但配置有些不正确。然而,奇怪的是,即使使用pip
我也无法获得工作引用。我做的最后一点环顾四周,别人(在一个完整的Linux发行版中)也有类似的问题,通过软件包管理器安装解决了这个问题。这就是为什么我相信我在某个地方丢失了一个配置或一个软件包,无论如何我都找不到东西也找不到地方。
1条答案
按热度按时间fquxozlt1#
邮件列表中的完整讨论通过@Arnout的回应链接到我最初的问题(谁指出了我的问题)。只是在这里总结标记为“答案”:
完整的解决方案是修改python.mk文件
path "/package/python3/python.mk
:1.将“disable-tk”更改为“enable-tk”
1.添加行“PYTHON3_DEPENDENCIES += tk”。我在第70-75行附近这样做了,在那里定义了其他python包依赖项。