【问题标题】:How do I call a .py GUI from a .cpp?如何从 .cpp 调用 .py GUI?
【发布时间】:2020-11-28 22:27:21
【问题描述】:

我正在使用 Python 3.8.5(64 位)和 Dev-C++(代码生成 ISO C++11,包括 Python 的包含文件夹,库也有 Python 的 Lib 文件夹)。

我用 Python 设计了一个非常简单和准系统的 ttk GUI,我所需要的只是让我的 .cpp 调用 GUI 并从中发送和接收数据。

到目前为止,我注意到我需要 #include <Python.h> 并使用 Py_Initialize();Py_Finalize(); 做一些事情。 我知道我可以从 Python GUI 的源文件中调用 .cpp,但我的老师希望反过来。

有没有办法做到这一点?

编辑 1: 例如,如果我运行以下代码:

#include <iostream>
#include <Python.h>

using namespace std;

int main()
{
    Py_Initialize();
    cout << Py_GetVersion() << endl;
    PyRun_SimpleString("print('C++ back-end & Python front-end')");
    Py_Finalize();
    return 1;
}

然后我得到错误:Python-C++.cpp:(.text+0x10): undefined reference to `__imp_Py_Initialize', GetVersion, SimpleStringFlags and for Finalize。

我可以在 Visual Studio 中完成吗?我在这里扯头发。

编辑 2:我让嵌入式 Python 在 Visual Studio 中工作。现在,如何使用 .cpp 导入 Interface.Py 以及如何将其用作 GUI?

【问题讨论】:

  • 只是“调用 GUI 并从中发送和接收数据”可能是一项艰巨的任务,并且可能具有相当多的含义。请详细说明目标?
  • @DavisHerring 我的作业是模拟一个大学招生计划。我们的教授告诉我们用 Python 创建一个 GUI,然后让 C++(我们可以使用 DevC++ 或 Visual Studio)调用 GUI,因为 GUI 有输入框和按钮,指示用户是学生还是管理员,想要注册还是做其他东西,等等。我只需要能够从 .cpp 调用 Interface.py 并以某种方式链接它们。
  • stackoverflow.com/questions/37238645/… 也许这会对你有所帮助...
  • @HokoLomal 这就是我发现的,但这不是我们教授想要的。她只想编译和运行 .cpp/exe,它可以处理所有事情。它打开 tkinter GUI (Interface.py),GUI 唯一要做的就是接收输入/条目并将其发送到 .cpp。 .cpp 处理所有后端计算。

标签: python c++ user-interface embed


【解决方案1】:
//Daniel Pantigoso e Isaac Brenes
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <stdio.h>
#include <conio.h>
#include <errno.h>
#include <Python.h>

using namespace std;

int main()
{
    FILE* scr;
    Py_Initialize();

    scr = fopen("Interface.py", "r");
    PyRun_SimpleFile(scr, "r");

    Py_Finalize();
    return 1;
}

您必须对 Visual Studio 的选项进行一些修改,但这是可行的。 Visual Studio 必须匹配您的 Python 安装(64 位 Python - x64 VS,32 位 Python - x86)。 项目属性必须有:

  • C/C++
  • 链接器

在 C/C++ 中 一般的: 附加包含目录:单击右侧的按钮 -> -> 文件夹按钮 -> ... 按钮 -> 导航到 Python 的安装位置 -> Python -> Python(您的版本) -> 包含-> 选择文件夹 -> 添加 -> 确定 预处理器: 预处理器定义:单击右侧的按钮 -> -> 复制粘贴:_CRT_SECURE_NO_WARNINGS -> Ok

在链接器中 一般的: 附加库目录(您必须这样做两次,因为您需要添加两个文件夹):单击右侧的按钮 -> -> 文件夹按钮 -> ... 按钮 -> 导航到您的Python 已安装 -> Python -> Python(你的版本) -> Lib & libs (你要添加这两个,这就是你必须做两次的原因) -> 选择文件夹 -> 添加-> 好的

你已经完成了。

【讨论】:

  • 这是琐碎的部分;除了将 python foo.py 作为命令的替代品之外,您将如何使用 C++ 程序?
  • @DavisHerring 我不知道和我的家庭作业搭档,我放弃了这个想法,因为它消耗了太多时间并且没有足够的可用资源。即使我们能够在 C++ 中嵌入 Python 并调用 Tkinter 窗口,将数据从 Tkinter 输入字段传递到 C++ 后端也是不可能的。我们看的地方都没有参考。
  • 提供一个嵌入 Python 脚本可以导入的模块并提供脚本可以向 Tkinter 注册的回调函数从根本上来说并不难。但是完全没有关于 C++ 代码如何工作的信息,很难确定这就是你想要的,或者提供一个有意义的例子。没有这一点,此评论和此答案无法回答问题。
  • 我知道这从根本上来说并不,但是当我不知道嵌入时我在做什么以及我到底是怎样的时候,它有点在黑暗中奔跑做错事:/如果我不必在一个半小时内把它交出来,我会用 C++ 代码提供一个更有意义的例子。我会在上交并睡一觉后更新它,因为我在处理这个问题时已经通宵达旦了。
猜你喜欢
  • 2020-01-28
  • 1970-01-01
  • 1970-01-01
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 2014-05-21
  • 1970-01-01
相关资源
最近更新 更多