我有一个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()