📄 00000005.htm
字号:
}
<BR>
<BR>static char tortoise_reset__doc__[] =
<BR>""
<BR>;
<BR>
<BR>static PyObject *
<BR>tortoise_reset(self, args)
<BR> PyObject *self; /* Not used */
<BR> PyObject *args;
<BR>{
<BR>
<BR> if (!PyArg_ParseTuple(args, ""))
<BR> return NULL;
<BR> currentX = currentY = WINDOW_SIZE/2;
<BR> currentDirection = 0.0;
<BR> penDown = 1;
<BR> Py_INCREF(Py_None);
<BR> return Py_None;
<BR>}
<BR>
<BR>static char tortoise_pendown__doc__[] =
<BR>""
<BR>;
<BR>
<BR>static PyObject *
<BR>tortoise_pendown(self, args)
<BR> PyObject *self; /* Not used */
<BR> PyObject *args;
<BR>{
<BR>
<BR> if (!PyArg_ParseTuple(args, ""))
<BR> return NULL;
<BR> penDown = 1;
<BR> Py_INCREF(Py_None);
<BR> return Py_None;
<BR>}
<BR>
<BR>static char tortoise_penup__doc__[] =
<BR>""
<BR>;
<BR>
<BR>static PyObject *
<BR>tortoise_penup(self, args)
<BR> PyObject *self; /* Not used */
<BR> PyObject *args;
<BR>{
<BR>
<BR> if (!PyArg_ParseTuple(args, ""))
<BR> return NULL;
<BR> penDown = 0;
<BR> Py_INCREF(Py_None);
<BR> return Py_None;
<BR>}
<BR>
<BR>static char tortoise_turn__doc__[] =
<BR>""
<BR>;
<BR>
<BR>static PyObject *
<BR>tortoise_turn(self, args)
<BR> PyObject *self; /* Not used */
<BR> PyObject *args;
<BR>{
<BR>
<BR> int degrees;
<BR> if (!PyArg_ParseTuple(args, "i", &degrees))
<BR> return NULL;
<BR> currentDirection += (double)degrees;
<BR> Py_INCREF(Py_None);
<BR> return Py_None;
<BR>}
<BR>
<BR>static char tortoise_move__doc__[] =
<BR>""
<BR>;
<BR>
<BR>static PyObject *
<BR>tortoise_move(self, args)
<BR> PyObject *self; /* Not used */
<BR> PyObject *args;
<BR>{
<BR> int steps;
<BR> double newX, newY;
<BR>
<BR> if (!PyArg_ParseTuple(args, "i", &steps))
<BR> return NULL;
<BR> /* first work out the new endpoint */
<BR> newX = currentX + sin(currentDirection*DEGREES_TO_RADIANS)*(double)steps;
<BR> newY = currentY - cos(currentDirection*DEGREES_TO_RADIANS)*(double)steps;
<BR> /* if the pen is down, draw a line */
<BR> if (penDown) XDrawLine(theDisplay, theWindow, theGC,
<BR> (int)currentX, (int)currentY, (int)newX, (int)newY);
<BR> /* in either case, move the tortoise */
<BR> currentX = newX;
<BR> currentY = newY;
<BR>
<BR> Py_INCREF(Py_None);
<BR> return Py_None;
<BR>}
<BR>
<BR>/* List of methods defined in the module */
<BR>
<BR>static struct PyMethodDef tortoise_methods[] = {
<BR> {"reset", (PyCFunction)tortoise_reset, METH_VARARGS, tortoise_reset__doc__},
<BR> <BR> {"pendown", (PyCFunction)tortoise_pendown, METH_VARARGS, tortoise_pendown__do <BR>c__},
<BR> {"penup", (PyCFunction)tortoise_penup, METH_VARARGS, tortoise_penup__doc__},
<BR> <BR> {"turn", (PyCFunction)tortoise_turn, METH_VARARGS, tortoise_turn__doc__},
<BR> {"move", (PyCFunction)tortoise_move, METH_VARARGS, tortoise_move__doc__},
<BR>
<BR> {NULL, (PyCFunction)NULL, 0, NULL} /* sentinel */
<BR>};
<BR>
<BR>
<BR>/* Initialization function for the module (*must* be called inittortoise) */
<BR>
<BR>static char tortoise_module_documentation[] =
<BR>""
<BR>;
<BR>
<BR>void
<BR>inittortoise()
<BR>{
<BR> PyObject *m, *d;
<BR>
<BR> /* Init X and working window */
<BR> init_workspace();
<BR>
<BR> /* Create the module and add the functions */
<BR> m = Py_InitModule4("tortoise", tortoise_methods,
<BR> tortoise_module_documentation,
<BR> (PyObject*)NULL,PYTHON_API_VERSION);
<BR>
<BR> /* Add some symbolic constants to the module */
<BR> d = PyModule_GetDict(m);
<BR> ErrorObject = PyString_FromString("tortoise.error");
<BR> PyDict_SetItemString(d, "error", ErrorObject);
<BR>
<BR> /* XXXX Add constants here */
<BR>
<BR> /* Check for errors */
<BR> if (PyErr_Occurred())
<BR> Py_FatalError("can't initialize module tortoise");
<BR>}
<BR>
<BR>/* -------------------------------------------------------------- */
<BR>
<BR> 我们在运行一编my_make_shared,好,一切搞定!来试验一下吧?
<BR>
<BR>[root@zhouj extend]# python
<BR>Python 1.5.2 (#1, Nov 25 1999, 14:59:15) [GCC 2.95.2 19991024 (release)] on <BR>linux-i386
<BR>Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
<BR>><I>>> from tortoise import *
</I><BR>><I>>> dir()
</I><BR>['__builtins__', '__doc__', '__name__', 'error', 'move', 'pendown', 'penup', <BR>'reset', 'turn']
<BR>><I>>> reset()
</I><BR>><I>>> move(100)
</I><BR>><I>>> for i in range(4):
</I><BR>... move(100)
<BR>... turn(90)
<BR>...
<BR>><I>>>
</I><BR>
<BR> 上面的命令在一个窗口里画了条线和一个正方型.而且是你敲入命令它就执行,很听话的 <BR>海龟,就是Logo的感觉,嘿嘿.搞定!
<BR> 我们总结一下写一个python扩展模块的步骤吧:1,用modulator生成程序框架.2,修改框架 <BR>,加入真正的功能代码.3,用make_shared或自己写makefile编译成.so动态库文件.4.没了 <BR>∶<I>)
</I><BR>
<BR> 上面的程序实在很简单,不过它向我们展示了用python作扩展模块是多么的容易,其实把 <BR>python的嵌入就比扩展多一点点东西,如果你感性趣,去看Python自带文档的<< <BR>Extending and Embedding the Python Interpreter >>和python源程序的Demo/embed目 <BR>录里的例子吧.其实python自己带的那么多模块也是用相同的方法作出来的,都放在 <BR>Modules目录下面,也是非常好的例子.相信我,这些时间的付出将使你获得一个强大,灵活 <BR>的工具.
<BR>
<BR>注:
<BR> 几个月前看了MoneyMaker大虾一片介绍python的文章,从此倘徉在python的奇妙世界,收 <BR>益非浅.python是个好东西,一直觉的好东西要大家一起分享:),所以边看无聊的春节晚会 <BR>边写了上面这个东东,就作为我送给linux版各位的春节礼物吧,祝各位蛇年顺利,天天开心 <BR>! And the same to myself ;-)
<BR> <BR> <BR>-- <BR>※ 来源:·BBS 水木清华站 smth.org·[FROM: 166.111.172.246] <BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -