代码之家  ›  专栏  ›  技术社区  ›  David L.

C++线程中嵌入的Python TKiter

  •  2
  • David L.  · 技术社区  · 5 年前

    我有一个C++项目,我想把一个嵌入式Python解释器添加到。实际上,我已经用简单的脚本成功地做到了这一点,但是当我尝试用Tkinter做一些事情时,它会打开一个空白窗口,并且从不绘制任何框架或内容。我很确定这和GIL有关,但一直未能找到一些有效的组合调用。我做了一个简单的例子,用编译程序运行的C++文件和Python脚本来说明这个问题。如果取消对MyPythonThread行的注释,并注释掉在线程中运行它的两个行,那么它将按预期工作。

    其他信息:我正在Mac OS X 10.13.6上测试,安装了Python2.7.15。

    //
    // Compile with: g++ `python-config --cflags --libs` --std=c++11 test.cc
    //
    
    #include <cstdio>
    #include <Python.h>
    #include <thread>
    
    void MyPythonThread(void)
    {
        PyEval_InitThreads();
        Py_Initialize();
    
        const char *fname = "test.py";
        PySys_SetArgv( 1, (char**)&fname );
        auto fil = std::fopen(fname, "r");
        PyRun_AnyFileEx( fil, NULL, 1 );
    
    }
    
    int main(int narg, char * argv[])
    {
    
        // This works
    //  MyPythonThread();
    
        // This does not
        std::thread thr(MyPythonThread);
        thr.join();
    
        return 0;
    }
    

    下面是它运行的python脚本:

    #!/usr/bin/env python
    
    import Tkinter as tk
    
    window = tk.Tk()
    top_frame = tk.Frame(window).pack()
    b1 = tk.Button(top_frame, text = "Button").pack()
    
    window.mainloop()
    
    0 回复  |  直到 5 年前