将 Python 嵌入 MFC 对话框
演示如何使用 Python 解释器求数学表达式
- 下载演示 (PyEmbedMFC) - 985.48 KB
- 下载源码 (PyEmbedMFC) - 25.32 KB
- 下载演示 (PyEmbedGTK) - 973.89 KB
- 下载源码 (PyEmbedGtk) - 24.43 KB
MFC 版本
GTK+ 版本
引言
我想展示在应用程序中使用 Python 解释器的方法。 虽然本文介绍的是一个 MFC 示例,但您不限于仅在 MFC 中使用它。 任何 GUI 工具包都可以用作前端。
还提供了一个 Gtk 前端实现,为此您需要安装 gtk 2.12 运行时,该运行时可免费获得。
背景
你们中的许多人可能在大多数商业 CAD 和科学应用程序中看到过数字输入字段,这些字段方便用户编写数学表达式。 这是为了允许用户将编辑框或微调框用作即时计算器。 我非常着迷于此功能,并且一直希望在我自己的应用程序中轻松拥有它。 编写解析器是一项漫长的工作。 当我刚开始学习 Python 时,我了解到它本身就是一个漂亮的计算器。 您只需在命令行上键入表达式并回车 -- 您就可以获得 C 程序员熟悉的任何数学函数的答案。 在网上和 Python API 文档上进行了长时间的搜索后,我终于知道如何简单地将一个 string
发送到解释器并检索结果。 我利用 Python API 的这种能力将其嵌入到对话框中。
Using the Code
要使用代码,您需要安装 Python 2.5。 它是免费提供的。 您必须在 Visual Studio 环境中设置 include 和 lib 路径。
通常,如果您使用默认安装程序设置安装 Python,它会安装在 C:\Python25 文件夹中。
您会找到一个“include”文件夹、一个“Lib”文件夹和一个“libs”文件夹。 请记住,库位于“libs”文件夹中,而不是位于“Lib”文件夹中。
诀窍是我们将获取用户在编辑控件中输入的字符串,将其传递给 Python 解释器,获取结果并将其写回编辑控件。 所有这些都是在控件失去焦点时完成的。
包含 Python.h 标头。
将 python25.lib 添加到所需的其他库。
BOOL CPyEmbedMFCDlg::OnInitDialog()
{
...
...
Py_Initialize(); // Remember to Initialize the interpreter
return TRUE; // return TRUE unless you set the focus to a control
}
void CPyEmbedMFCDlg::OnEnKillfocusEdit2()
{
// TODO: Add your control notification handler code here
UpdateData();
double res = EvalExpression(m_Expr2);
m_Expr2.Format("%0.3f", res);
UpdateData(FALSE);
}
double CPyEmbedMFCDlg::EvalExpression(CString iStr)
{
double lval;
char* expr = iStr.GetBuffer(0);
PyObject * main_mod = NULL;
PyObject * main_dict = NULL;
PyObject * obj = NULL;
main_mod = PyImport_AddModule("__main__");
main_dict = PyModule_GetDict(main_mod);
PyRun_SimpleString("from math import *");
obj = PyRun_String(expr, Py_eval_input, main_dict, NULL);
if (obj != NULL)
{
lval = PyFloat_AsDouble(obj);
return lval;
}
return 0.0;
}
就这么简单。 每个 GUI 工具包都会为您提供某种文本编辑组件。 在 MFC 中,我将 CEditCtrl
与 CSpinButtonCtrl
结合使用。 在 Gtk 中,您将获得集成了微调器的 GtkSpinButton
。 共同点是您必须处理焦点丢失事件才能调用评估代码。 在 Gtk 示例中,我为焦点丢失和键盘的 Enter 事件都进行了处理。
在提供的示例中,在任何编辑控件中输入数学表达式并按 Tab 键更改焦点,您将在控件本身中获得评估结果。
注意:要运行该应用程序,您不需要安装 Python。 Python25.dll 随示例一起提供。 同样,在打包您的应用程序时,您只需要运送相同的 dll 文件。
关注点
您可以使用所有 C 语法输入数学表达式,包括三角函数和其他函数。 还支持常量 pi 和 e。 有关支持的数学调用的信息,请参阅 Python 手册。
请参阅负责启用数学库函数的函数
PyRun_SimpleString("from math import *");
在调试模式下构建示例
如果在调试模式下构建示例,您会收到一个错误:“无法打开文件 "python25_d.lib"”。 要解决此问题,请在 Python 安装的“libs”文件夹中复制现有的 python25.lib,并将其重命名为 python25_d.lib,它将编译。 您需要这样做才能仅构建调试版本。 发布版本将毫无问题地构建。 尽管在调试配置链接器输入设置中的附加依赖项中添加了 python25.lib,但仍然出现此错误,因此我找到了这种解决方法。 如果有人可以对此问题有所了解,那将很有帮助。
历史
- 2008 年 12 月 16 日:首次发布.. 并且可能是最终版本