首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Windows上嵌入支持tkinter的Python 3.5

在Windows上嵌入支持tkinter的Python 3.5
EN

Stack Overflow用户
提问于 2016-11-09 08:06:21
回答 1查看 2.2K关注 0票数 7

我的项目结构如下所示:

代码语言:javascript
复制
emb
|   CMakeLists.txt
|   main.c
|   python35.lib
|   stdlib.zip
|   _tkinter.pyd
|
+---include
|   |
|   |   abstract.h
|   |   accu.h
|   |   asdl.h
...
|   |   warnings.h
|   |   weakrefobject.h
|
+---build
|   |   emb.exe

stdlib.zip包含来自Python3.5.2安装的DLL、Lib和site-packages目录,其路径附加到sys.path。我通过链接到python35.lib来隐式加载python35.dll,它包含DLL中所有导出函数的存根。下面是CMakeLists.txt的内容

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.6)
project(embpython)

set(SOURCE_FILES main.c)
add_executable(${PROJECT_NAME} ${SOURCE_FILES})

set(PYTHON_INCLUDE_DIR include)
include_directories(${PYTHON_INCLUDE_DIR})

target_link_libraries(
        ${PROJECT_NAME}
        ${CMAKE_CURRENT_LIST_DIR}/python35.lib
        ${CMAKE_CURRENT_LIST_DIR}/_tkinter.pyd)

下面是main.c的内容

代码语言:javascript
复制
#include <Python.h>

int main(int argc, char** argv)
{
    wchar_t* program_name;
    wchar_t* sys_path;
    char* path;

    program_name = Py_DecodeLocale(argv[0], NULL);
    if (program_name == NULL)
    {
        fprintf(stderr, "Fatal error: cannot decode argv[0]\n");
        exit(1);
    }
    Py_SetProgramName(program_name);

    path = "stdlib.zip;stdlib.zip/DLLs;stdlib.zip/Lib;"
        "stdlib.zip/site-packages";
    sys_path = Py_DecodeLocale(path, NULL);
    Py_SetPath(sys_path);

    Py_Initialize();

    PySys_SetArgv(argc, argv);

    PyRun_SimpleString("import tkinter\n");

    Py_Finalize();
    PyMem_RawFree(sys_path);
    PyMem_RawFree(program_name);
    return 0;
}

现在,这是我得到的错误:

代码语言:javascript
复制
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File " ... emb\stdlib.zip\Lib\tkinter\__init__.py", line 35, in <module>
ImportError: DLL load failed: The specified module could not be found.

我做错了什么?我如何才能纠正它?

EN

回答 1

Stack Overflow用户

发布于 2016-11-15 07:14:47

只需在Jovito回答所有问题后进行更新,以指定如何使其成为轻型安装(步骤3到5,这将节省空间):

\Pythonpath\DLLs\中的_tkinter.pyd文件复制到嵌入式安装的python35.dll所在的目录中。您还需要2个DLL才能使tkinter在同一位置tcl86t.dlltk86t.dll中工作

您需要这些目录:\Pythonpath\Lib\tkinter\Pythonpath\tcl\tcl8.6\Pythonpath\tcl\tk8.6,并且必须在main.py脚本中进行设置,如下所示:

代码语言:javascript
复制
import os
os.environ['TCL_LIBRARY'] = "tcl//tcl8.6"
os.environ['TK_LIBRARY'] = "tcl//tk8.6"

这使得Jovito的答案尽可能轻量级。用他剩下的答案。这对我很有效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40498491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档