俺这里想给大家初步介绍一下Python编程. 各位能看英文的,
最好是去看www.python.org上的其原作者Guido van Rossum
的入门介绍. (Python看成自1.6版以后就能处理Unicode的了,
故而也能很方便也处理中文了.) 俺这里只略提一二:
1)解释性语言一般都是完成任务快, 但所编的程序运行起来
有时会比编译语言编的程序(C/C++, Fortran, Pascal等)
要慢一个数量及以上. 虽然, 日常生活中仍然有许多事
俺们是不在乎它是0.0001秒内完成还是在0.1秒内完成,及
有时更在乎在短时间内完成一个很大的任务, 故而解释性
语言仍有很大市场. 更别提一般的解释性语言都可以用C/C++
等编成模块来处理关键性的任务.
2)常用的解释性语言有Perl, Python, Lisp/Scheme, Ruby等.
其中Perl算是运用最广泛的了; 但Perl的程序不易管理大概
也是举世公认的(它的宗义即为: "总有其它方法来完成这个
任务", 从而经常每个人有每个人的风格). Python相对Perl
的这点真是简单了不少. 它比Perl年轻不少, 但用户增长速
度很快. 目前好象是说Mandrake, Debian的系统管理在用
Perl, 但大哥大红帽则在用Python.
3)Python的交互式用法(可用作计算器, 或测试一个不熟悉的
函数等). 示例如下( >>>是Python的提示符 ):
$python
Python 2.1a1 (#4, Jan 29 2001, 20:22:47)
[GCC 2.95.2 19991024 (release)] on sunos5
Type "copyright", "credits" or "license" for more information.
>>> 3+4**2
19
>>> x=5
>>> y=6
>>> x/y
0
>>> x*1.0/y
0.83333333333333337
>>>
4)略解:
a)变量不用先定义类型, 直接由系统识别(大多解释性语言
都这样)
b)用行头空格数来标识块的起始, 省去了Perl/C/C++的{;}
没有{}匹配问题应该是省了不少头痛的. — 这一点刚
开始会不太习惯, 熟了后真是很感谢G.V. Rossum的发明
c)没有了Perl中的$%@&等符号. (为方便, 下面俺将变量的
结果放在 ==> 的右边)
c.1) 字串(单引号等于双引号):
a = 'Well well study' + ', Day day up!'
则:
a[3] ==> 'l'
a[-1] ==> '!'
a[0:-1] ==> 'Well well study, Day day up!'
c.2) 数列(List), 相当于数组, 可以含不同类型
x = ['abc', 4, 'python']
则:
x[0] ==> 'abc'
x[1] ==> 4
c.3) 字典(Dictionary), 可以用字串作指标
mathScore = { 'xah': 59, 'tinybit': 99 }
则:
mathScore['tinybit'] ==> 99
d)函数, 可以用缺省参数:
def score (user='tinybit', whichExam='yesterday'):
if whichExam != 'yesterday': return 0
if user=='tinybit': return 99
else: return 59
于是:
score() ==> 99
score('xah') ==> 59
还可以用关键词来调用:
score(whichExam='tomorrow') ==> 0
e)模块, 俺就不多说了
f)类(Class), 面向对象的编程, 同上.
g)图形界面编程(GUI), 其缺省为基于TCL/TK上的Tkinter,
不过它的功能不是很多; 基于跨平台wxWindows库的
wxPython功能要强不少(尚未中文化, 有待各位努力).
还有基于Qt和Gtk库的, 不过Gtk好象目前还不能在Windows
上很好的运行, Qt虽能, 也很成熟, 但若在Windows上运行
它原则上要向TrollTech上贡$1,500的, 不象wxWindows完全
免费.
好了, 俺就先多嘴至此. 各位同仁感兴趣的, 该去 python.org
当下它的入门简介, 俺有80-90%的把握that你会喜欢它的.
循环, 条件 及 函数编程工具
俺在上篇中大略介绍了Python的变量与函数, 这里稍作补充来解释一下Python
的循环, 条件及函数编程工具. (还是按上篇的方法: 将变量或函数
的结果放在 ==> 的右边)
1) 循环
首先得更正上篇中一个小错误: Python的范围含首不含尾, 所以
若:
a = 'Well well study' + ', Day day up!'
则:
a[0:-1] ==> 'Well well study, Day day up' #不包括最后的'!'
Python还有一个专门的范围函数: range. 例如:
range(4) ==> [0, 1, 2, 3]
range(2, 5) ==> [2, 3, 4]
它在for循环中常用.如:
total = 0
for i in range(11): total += i
最后 total ==> 55
循环也可以用 while, 如:
total, i = 0, 0
while i<11: total += i; i += 1
2) 条件编程是:
if 条件语句 : 命令1
elif 条件语句: 命令2
else: 命令3
条件语句中相当于C的&&是and, 相当于||是or; 其中不允许赋值,
以避免C/C++中的不小心将 == 写成 = 后这一很常见的头痛. 例:
total, i = 0, 0
while 1:
total += i; i += 1
if i>11 or total > 55: break
3) 函数编程工具 (map/filter/reduce)
这几个工具, 可以帮你在处理数列时只调用一次函数, 从而在简
单处理大批数据时, 有可能大幅提高程度的执行速度.
map(函数f, 数列l) ==> [ f(l[0]), f(l[0]), … ]
filter (f, l) ==> 只在l中剩下对f是真的值
reduce (f, l) ==> 用l中头两个数作参数调用f, 产生的结果再
==> 与l中的第三个数作参数去调用f, 如此到底
如:
def add(x,y): return x+y
reduce ( add, range(1,11) ) ==> 55
def PingFang(x): return x*x
map ( PingFang, range(1,5) ) ==> [1, 4, 9, 16]
def JiShu (x): return x%2 == 1
filter ( JiShu, range(8) ) ==> [1, 3, 5, 7]
4) 若想让你编的脚本能直接执行, 只要象其他Shell脚本一样, 在脚本第一
行头加上Python的路径即可.
#!/PythonPath/python #或用: #!/usr/bin/env python
可以用sys.argv, len(sys.argv) 得到C/C++中的argv, argc. (若引入:
from sys import argv
之后, 上面的sys.argv 就可直接写成 argv — 下次俺提到模块时再
细说. )
—————————————————————————–
–
模块与类
头两篇都没提到Python的模块与类, 这里来补充一下:
1)模块(Module)
你可以将几个函数编好放在一个文件中, 比方说你的
score.py文件中有: mathScore(), physScore(),
chemScore() 等几个函数; 将之放在当前目录或是PYTHON
的系统调用目录中; 于是你在当前目录中的另一个文件中,
就可以有两种方法调用:
a)
import score
score.mathScore('xah')
…
b)
from score import *
#或可用 from score import mathScore
mathScore('xah')
…
第二种方法引入模块后,调用时就不要前缀score了; 当然
第二种调用方法容易重名. 总之, Python的模块编写是很
简单的. (稍麻烦一点的是你想用C/C++来编一个Python模
块.) 俺自己就把常用的物理常数编在physConst.py中,将
之放到Python安装目录下.
在简介(二)中俺提到过from sys import argv之事, 因为
Python作为缺省已经以"import sys"的形式引入了sys 模
块, 所以你可以直接把 sys.argv 当作C/C++中
main(int argc, char *argv[])
里的 argv 来用; 也可用"from sys import argv"再引入
一次, 于是后面皆可直接呼之为 argv
模块文件的第一个有效行(非注释行)可以是一行字串, 或
是夹在""" 与 """之间的若干行文字.(同样, 单引号等于
双引号: ''' == """ .) 函数的定义也一样. 于是日后
别人或自己在调用该函数/模块时, 即可用:
print 该函数/模块.__doc__
来看这个函数/模块的说明.
2)类(Class)
class MyClass(父类): #从父类遗传一个子类: MyClass
def method1(self, …):
…
def mether2(self, …):
self.method1()
…
类的实体化(instantiation)和调用为:
c = MyClass(…)
c.method1(…)
c.method2(…)
这里有方法(method)和函数(function)的区别在.
method(args) == function(对象, args)
所以在类的函数定义中, 第一个参数皆为对象. 通常情况下, 都将其
写为self. self本身并无实义, 这只是Python的习惯, 可能老的类浏
览软件会依靠self. 实体化后的调用, 如上面 c.method1(…) 就是
方法调用, 故不需要写出第一个对象参数.
self还有一个用法. 因Python没有用Private/Public/Protected, 它
的函数中定义的变量都是局部变量. 当在一个函数之内调用类的变量
或函数时要加上self. 如:
class My:
x = 3
def PingFang(self): return self.x ** 2
def LiFang(self): return self.PingFang() * self.x
于是当实体化: m = My() 后,
m.PingFang() ==> 9
m.LiFang() ==> 27
当在一个函数中调用另外一个函数的变量时, 两个函数中的变量都加
上"self."
通常还可定义一个相当于C++中类的初始构造器(constructor)的一个
函数:
def __init__(self, …):
…
类中的变量通常是不能隐形的, 在类的定义之外还可任意改变, 甚至
添加新变量, 与删除新变量. 但__AA_形式的变量是特别的 ( 前头最
少两个下划线, 尾部最多一个下划线.), 它相当于C++中的Protected
变量.
Python的类有点绕脑筋, 不过各位若去看看它的图形界面编程(GUI),就
会发现它还是蛮有用和蛮好用的. 感兴趣的, 可以到 python.org 和
wxPython.org上走走.
诡计之一: 对简单的任务, 俺通常将之写为非面向对象的, 🙂
图象界面编程 (GUI)
首先得对简介(三)中类的方法与函数的差别作一小更正(幸得Kh9
先生指正于其后的文章点评中):
在类的实体化:
对象 = 类(初始化参数)
之后对对象方法的调用:
对象.方法(参数)
其实是相当于调用如下函数:
类.方法(对象, 参数)
因为Python是用C而不是C++写的. 大家可以看到其作
者对类的处理还是蛮合理的.
对类的了解可以在其图象界面编程(GUI)中得以深入.俺自己当初
学C时就对它的画图功能十分感兴趣,曾用之画过不少数学解集,
如混沌学中气象预报的Lorentz方程 (正发现网上有Java展示:
http://www.wcinet.net/~joshw/na/chaos/Lorentz.html
和分形学中的Mandelbrot集合等. 所以对Python的图象编程也趣
味盎然.
Python的GUI主要是与其它己存在图形库的结合. 目前主要有:基
于Tcl/Tk库的Tkinter,基于wxWindows库的wxPython,基于Qt/Kde
库的PyQt/PyKde和基于Gtk+/Gnome库的PyGtk/PyGnome.其他还有
基于FlTk库的FlPy, 基于Fox库的FoxPy等.
Python自带了Tkinter,其编程之简单也基本类似Tcl/Tk, 但Tk的
对象不很丰富,所产生的图形也不是很漂亮.俺曾看到网上有人比
较过wxPython与Tkinter的画点速度,发现wxPython要快一个数量
级.这可能是因Tkinter不仅要调用Python还得用Tcl两个脚本语
言之故.对于PyQt,俺没能在俺的Mandrake7.2上编译成功,所以就
没学它了, 不过据说也拥有稍小于wxPython的用户群;PyGtk目前
还不如wxPython和PyQt成熟. 下面俺就略说一下Tkinter.就入门
而言, Tkinter还是值得一瞄的.而且网上有很多关于它的入门介
绍, 如:
http://www.pythonware.com/library/an-introduction-to-tkinter.htm
http://www.python.org/doc/life-preserver/
也正好看到OSO就有<<Teach Yourself Python>>的源码下载,其后
面几章就是Tkinter的样例, 其中一个就是画Mandelbrot集的.
a)Tk与Tkinter对照:
Tk ==> Tkinter
button .b ==> b=Button() #在根窗口中定义一个按钮
button .panel.b ==> b=Button(panel) #在面板中定义一个按钮.
button .b -fg red ==> b=Button(fg="red") #设置前景色
.b configure -fg red ==> b["fg"]=red #部件产生后再配置
==> b.config(fg="red") #第二种方法
pack .b -side left ==> b.pack(side="left") #列入右边并显示
b)最简单的例子 (一个窗口中含字串: Hello, world!)
from Tkinter import *
root = Tk() #产生一个根窗口
l = Label(root, text="Hello, world!")# 产生一个标识
l.pack()
root.mainloop() #进入主循环, 有事件则运行, 无事就等着
c)仍是十分简单的例子(一个窗口中两个按钮:Quit和Hello)
from Tkinter import * #引入Tkinter模块
class App: #定义一个类
def __init__(self, master): #类的构造器, 相当于C++的constructor
frame = Frame(master) #产生一个框架
frame.pack()
button = Button(frame, text="QUIT", fg="red", command=frame.quit)
button.pack(side=LEFT)
hi_there = Button(frame, text="Hello", command=self.say_hi)
#self.say_hi是调用类的函数 say_hi()
hi_there.pack(side=LEFT)
def say_hi(self):
print "hi there, everyone!"
root = Tk()
app = App(root) #上面__init__有两个参数, self只是对象
root.mainloop()
上面b), c)取自:
http://www.pythonware.com/library/tkinter/introduction/
因b)简单, c)介绍了类的用法. 在c)中俺将它原来的self.button
和self.hi_there改成了button和hi_there, 因为不会在类的其它
地方调用这两个器件. 俺刚才试过, 没问题的.
另外,OSO发文时好象不能发图片.俺自己倒是省了点事.读者可以到
上面所给地址去看程序运行结果, 及更多内容. 俺这里只是想给大
家一个初始印象.
顺便说一下,俺本来还想给出wxPython的两个例子,幸好到OSO上的
搜索了一下, 原来limodou先生已经将O'Reilly书:
<<Python Programming on Win32>>
中有关wxPython的内容全译了:
http://www.oso.com.cn/read_article.php?article_id=4134
而且是最近才译的, 看来 "英雄所见略同", 🙂 不过俺发现他文章
样例程序中的行头空格全没了 — 这样的Python程序是无法运行的.
也许是浏览器将之当作Html文件了.所以推荐其原网页供各位下载样
例源码:
http://www.oreilly.com/catalog/pythonwin32/chapter/ch20.html
(其实oreilly.com上仅仅给了<<Win32上的Python编程>>中的两章作
样子,但幸运的是其中就有这章GUI编程.) wxPython.org上的简介还
没有O'Reilly上的详细. wxPython的作者及wxWindows的几位一起开
了个wxpros.com, 来提供支持服务(如培训,付费答疑等), 愿其成功,
或至少能供养肚子继续发展wxPython, 🙂
杂类
这里俺想补充几点俺的前面四篇中尚未提及但仍很有用的地方. 下面
将要出现的 …是Python的第二提示符, 表示继续一个不完整的命令
*)Python中的每个变量都是对象 — Python特有的对象, 并不一定
都是 "面向对象的编程" 中的对象
*)第一有效行(非解释行), 其行首必须没有空格(在Python中, 表格
键Tab 缺省是等于8个空格.)
*)续行可以用行末的 '\', 注意其后必需是回车/换行; 对于包在大,
中, 小括号中的若干行, 系统都缺省作续在一起的一行. 但不能把
一个变量名分开放在两行上. 如:
>>> score = {'xah':59,
… 'you':99}
>>>
>>> score\
… ['xah']
59
>>> scor\
… e['xah'] #错误
File "<stdin>", line 2
e['xah']
^
SyntaxError: invalid syntax
>>>
*)交互式用法中的下划线: _ , 是上面一行命令运行的结果. 如:
>>> 3+5
8
>>> _ * 7
56
*)屏幕输出
在print最后加一逗号, 就不会自动输出'\n', 而输出一空格;
也可用格式符:
>>> print 'a'; print 'b'
a
b
>>> print 'a',; print 'b' #第一句后加了一个逗号
a b
>>> print '%x %s' % (11, 'abc') #多变量时须用小括号括起,见下面: Tuple
b abc
再重提一下, 包在匹配的 三个单引号或三个双引号之间的字
串, 可以是多行, 相当于HTML中的<PRE>和</PRE>, 即原样在
屏幕上输出. 也可对它们用格式符:
>>> a = ''' pytho
… n is %s!''' % 'great'
>>> a
' pytho\012n is great!' #Python用8进制显示控制字符: \n == \012
>>> print a
pytho
n is great!
>>>
Python 2.0版之后就可能用 >>stderr 来打印到标准错误输出:
>>> from sys import stderr
>>> print >> stderr, 'ok'
ok
2.0版之前好象是用文件形式: stderr.write('ok')
*)字串变数字, 数字变字串:
>>> int('123')
123
>>> float('123')
123.0
>>> eval('123') #随所给字串, 既可产生整数, 也可浮点数
123
>>> str(123) #数字到字串
'123'
>>> `123` #反向单引号, 还可用函数: repr(数字变量)
'123'
*)屏幕输入:
字串输入: s = raw_input(提示字串)
数字输入: x = input(提示字串) #相当于: eval(raw_input())
*)字串按空格或其它用户定义的分隔符来分隔.
Python 2.0版以后的, 可以用:
>>> a='123 321 456'
>>> a.split()
['123', '321', '456']
>>> a.split('2')
['1', '3 3', '1 456']
>>> 'AA'.join( a.split('2') ) #按分隔符'AA'将字串数列合并
'1AA3 3AA1 456'
但2.0(或至少1.6 ?)以前必须要引入string模块: (也即2.0
将原本在string模块中的不少函数并入字串的方法中去了,
但不是全部):
>>> from string import split, join
split(a,'2')
['1', '3 3', '1 456']
>>> join ( split(a,'2'), 'AA') #同上, 但调用了函数
'1AA3 3AA1 456'
*)交互式下可以用dir()来看从模块中引入了什么函数与变量:
>>> import math
>>> dir(math)
['__doc__', '__file__', '__name__', 'acos', 'asin',
'atan', 'atan2', 'ceil', 'cos', 'cosh', 'e', 'exp'
, 'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp
', 'log', 'log10', 'modf', 'pi', 'pow', 'sin', 'sin
h', 'sqrt', 'tan', 'tanh']
看函数/模块的说明(函数/模块中的第一行字串, 或多行位于
成对的''', """之间):
>>> import math
>>> print math.__doc__
This module is always available. It provides access to the
mathematical functions defined by the C standard.
>>> print math.sin.__doc__
sin(x)
Return the sine of x.
>>>
*)文件
打开:
f = open("My.py") #只读
f = open("My.py", "r") #只读
f = open("My.py", 'r+b')#可读可写, 二进制文件
f = open("tmpFile", 'w')#只写
读:
s = f.read(字节数) #读给定字节数的内容
text = f.read() #读整个文件, 得到一字串
line = f.readline() #读一行(含换行符: '\n')
lines = f.readlines() #读整个文件, 得到字串数列
#lines[-1]是最末一行(含'\n'), 等等
写:
f.write('AAAbbb\n') #写一个字串
f.writelines(lines) #写字串所组成的数列
关闭:
f.close()
*)lambda函数
来自Lisp/Scheme, 好象是只能有一个执行句子. 可能主要是
用来简写一个函数的定义.
>>> f = lambda a, b, c : (a + b ) * c
>>> f(1,2,3)
9
看样子它有点类似于C/C++中的:
#define max(A, B) (A)>(B) ? (A) : (B)
*)空白类可以来作C中的"struct"功能:
>>> class My: pass
… #其中pass是不执行任何命令. 大概是由于分号在Python
… #中不太起作用, 所以引入"pass". 而C中就可以用:
… # for (;;);
… #来"等你等到天尽头".
…
>>> xah = My()
>>> xah.birthDay = 1
>>> xah.birthYear = 3000
>>> xah.birthYear
3000
>>>
*)错误处理
通常Python若出错误, 即会自动退出. 但你可以用
try : 可能出错语句
except 特定错误 : 出错后要执行的命令
来处理. 如:
>>> 1/0 #除0错误
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ZeroDivisionError: integer division or modulo by zero
>>> try: 1/0
… except ZeroDivisionError:
… print "ok"
…
ok
*)Tuple, 俺在<<英华大字典>>上都没找到其译文. 马苏安的星际
译王将之译为"元组". 英文解释似乎也很强调它的有序性.这里
俺就暂用"元组".
Python的元组是用小括号括起来的变量, 常数, 函数等对象的组
合, 虽然有时候小括号可以省略. 如俺以前给出过:
total, i = 0, 0
其实就是元组赋值:
(total, i) = (0, 0)
*)字串和元组皆是一经产生就不可再变更, 只能另赋新值. 这也是
元组不同数列之处. 数列和字典皆可在产生之后变更. 如:
>>> s="abc"
>>> s[2] = 'D' #错误:
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: object doesn't support item assignment
>>> t = (3, 5)
>>> t[0] = 4 #错误
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: object doesn't support item assignment
但可以用其片段来组成一个另变量:
>>> s='abc'
>>> s2 = s[1:-1] + 'd'
>>> s2
'bd'
>>> s='def'
>>> s
'def'
元组中的可变更变量也可另赋值:
>>> x, y = 3, 5
>>> a=(x,y)
>>> a
(3, 5)
>>> y=4
>>> a
(3, 5)
>>> x,y=3, [4,5]
>>> z=x, y
>>> z
(3, [4, 5])
>>> y[0] = 2
>>> z
(3, [2, 5])
>>>
*)赋值,
跟能常所说的(如C/C++)赋值有些不一样.
变量赋给变量时, 只是增加了对同一对象的参考(Reference),
而不产生新变量. 如:
>>> l=[3,4]
>>> l2=l
>>> l[0]=-1
>>> l
[-1, 4]
>>> l2
[-1, 4]
而俺发现用l2 = l[0:]就不一样:
>>> l=[3,4]
>>> l2=l[0:]
>>> l[0]=-1
>>> l
[-1, 4]
>>> l2
[3, 4]
但对不可变更的对象, 因其不可变更, 或只能另赋新值, 所以
只表现为常见的"赋值即产生新对象"的样子:
>>> s='abc'
>>> ss = s
>>> ss
'abc'
>>> s='345'
>>> s
'345'
>>> ss
'abc'
本节结语: 希望大家不要被俺绕糊涂了, 俺只是想提供一些Python
与通常的语言, 如C/C++, 相比而不同之处. 总的来说, Python还是
蛮好用的. wxPython作者, 罗宾 . 邓恩 (Robin Dunn) 就在网上说,
他个人习惯是一切编程皆用Python; 即使真需要速度, 他也将C/C++
编成Python模块.
到此为止对Python还很感兴趣的同志, 可以去当Python的库参考了.
(mpage可以4合1, 加上正反面打印, python.org上的400页库参考
你50张纸就行了, 只要你视力不是太弱可以看小号字体, 🙂 )
–
pygtk 的图象编程
俺最近又稍学了点pygtk, 贴出来给大家分享.
俺去学pygtk的原因是, 俺发现在俺的机子上pygtk比wxpython在
启动时要几乎快上一倍(1-2秒相对于2-5秒); 并且俺发现一个简
单的按钮显示, wxpython的程序运行起来要占约10-12M内存, 而
pygtk的只要约5-6M.
后来俺就到wxpython的用户邮件列表上发问, 那里的人还很热心
地作了解释, 说启动速度和内存是因为UNIX下的wxGtk在是对Gtk
库进行包装的结果, 并说启动之后的执行速度二者应无显蓍差别.
wxWindows故而拥有很好的移植性. 还有人指出了二者其它异同.
大意是pygtk还可以使用主题色彩配置(themes), 而且gnomepy还
可以使用libglade库来简化很多编程任务; 但wxpython的小器件
(widget)还是要比目前的pygtk要丰富. 关于Gtk在MS Windows上
的运行, 有人说很稳定了, 也有人说每5分钟死一次机. 另外,俺
还瞄了瞄二者用户列表上的帖子数量, 发现wxpython的约为pygtk
的两倍左右.
所以总的看来, 还是各有千秋. 大家不妨也来瞄瞄pygtk.
Gtk+与Python的结合早就有人捣弄了, 不过目前最正统还是
James Henstridge做的,看网址他好象是澳大利亚人. pygtk的
主页在:
http://www.daa.com.au/~james/pygtk/
而在这里有pygnome的入门简介:
http://laguna.fmedic.unam.mx/~daniel/pygtutorial/
俺下面就取其中的两个例子(也是pygtk源程序中examples/simple
目录中的两个程序)稍作解释.
pygtk目前的稳定版是0.6.6; 作者说: 别看它版本还不高, 里
面的小器件还真不少, Gtk+ 1.2的玩意差不多全包括了. 咱这
就过来瞧一瞧.
pygtk有两种实现. 最老早的是基于C语言的函数调用形式, 这
倒与Gtk+本身很相近; 后来采用了面向对象的形式, 感觉要简
洁不少. 请看:
1)"世界好!"的C语言调用形式
(来自pygtk源程序中的examples/simple/hello1.py)
#!/usr/bin/env python #让程序可执行
from _gtk import * #引入pygtk的C函数模块, gtk前有下划线
from GTK import * #引入常用变量模块
def hello(*args): #函数定义: 屏幕显示"世界好"
print "Hello World"
gtk_widget_destroy(window)
def destroy(*args): #退出函数定义
gtk_widget_hide(window)
gtk_main_quit()
gtk_init() #Gtk初始化
window = gtk_window_new(WINDOW_TOPLEVEL) #产生一个窗口
gtk_signal_connect(window, "destroy", destroy) #退出信号连接
gtk_container_set_border_width(window, 10) #边界宽度设定
button = gtk_button_new_with_label("Hello World")#产生一个按钮
gtk_signal_connect(button, "clicked", hello) #鼠标点击传到函数
gtk_container_add(window, button) #将按钮加入到窗口中
gtk_widget_show(button) #显示按钮
gtk_widget_show(window) #显示窗口
gtk_main() #等待鼠标动作
2)"世界好!"的面向对象的形式
(来自pygtk源程序中的examples/simple/hello2.py)
#!/usr/bin/env python
from gtk import * #引入pygtk的面向对象的模块, gtk前无下划线
def hello(*args):
print "Hello World"
window.destroy()
def destroy(*args):
window.hide()
mainquit()
window = GtkWindow(WINDOW_TOPLEVEL) #产生一个窗口
window.connect("destroy", destroy) #退出信号连接
window.set_border_width(10) #边界宽度设定
button = GtkButton("Hello World") #产生一个按钮
button.connect("clicked", hello) #鼠标点击传到函数
window.add(button) #将按钮加入到窗口中
button.show() #显示按钮
window.show() #显示窗口
mainloop() #等待鼠标动作
===========
大家是不是也觉得第二种方法要简洁 ? pygtk的作者好象也是推荐
大家用第二种方式. 对大一点的程序, 照样可以用类(class)来把
它表达的很清楚.
俺就不多说了, 各位感兴趣的, 可以去上面的入门介绍中看看它们
运行的屏幕取像(screenshot), 再去当下pygtk的源程序装上(很小,
300k, 也很容易装上), 并运行一下它里面examples目录下的样例,
就会很了解pygtk能干什么活了. 当你自己想用它编简单任务时,直
接在其某个样例的基础进行加工是最省事的了.