﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-简单为美-随笔分类-Python</title><link>http://www.cppblog.com/len/category/7469.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 15 Jul 2008 16:30:38 GMT</lastBuildDate><pubDate>Tue, 15 Jul 2008 16:30:38 GMT</pubDate><ttl>60</ttl><item><title>wxPython和XRC文件实现i18n</title><link>http://www.cppblog.com/len/archive/2008/07/15/56229.html</link><dc:creator>len</dc:creator><author>len</author><pubDate>Tue, 15 Jul 2008 12:21:00 GMT</pubDate><guid>http://www.cppblog.com/len/archive/2008/07/15/56229.html</guid><wfw:comment>http://www.cppblog.com/len/comments/56229.html</wfw:comment><comments>http://www.cppblog.com/len/archive/2008/07/15/56229.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/len/comments/commentRss/56229.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/len/services/trackbacks/56229.html</trackback:ping><description><![CDATA[
		<p>应用程序国际化，在开源世界里常以i18n被提及，i18n是Internationalization的简写，正好18个字母。在wxPython程序进行i18n，如果字符串是编码在源文件中时，完全可按照python程序的i18n的方法，即使用gexttext和locale模块。而wxPython程序在使用XRC文件做为界面资源时，则应使用wx.Locale模块，它封装了区域化相关的操作。i18n，或者国际化实际上涉及到语言习惯，数字格式等等类别的内容。这里只介绍语言多国化，将一个简单的英文程序转换为中文，涉及到源文件，可从<a href="/Files/len/wx.zip">这里</a>下载。</p>
		<h3>创建PO文件</h3>
		<p>PO文件是Portable Object文件的简称，它包含需要翻译的字符串。我们需要从源文件进行提取。首先，对源文件test.py编辑，标识代码里需要翻译的字符串内容。我们使用_("xx")的方法，这种形式可能在许多开源源代码中见识过。</p>
		<pre class="code">#加载菜单栏
menubar = rc.LoadMenuBar('IDR_MENU')</pre>
		<p>这里的IDR_MENU是资源标识ID，不需要翻译，因此不做改变，而下面的代码：</p>
		<pre class="code">info.SetVersion('1.0')
info.SetDescription('XRC i18n Demo')</pre>
		<p>'XRC i18n Demo'是描述性的文本，需要进行翻译，将需要处理为</p>
		<pre class="code">info.SetVersion('1.0')
info.SetDescription(_('XRC i18n Demo'))</pre>
		<p>接着需要生成.pot(Portable Object Template)，这是po的模板文件。在将来程序可能配置成其他语种，其他语言的po文件都从它而来。为了创建这文件，需要用到GNU gettext工具集中的xgettext。向xgettext传入些必要的信息，来创建.pot文件。</p>
		<pre class="console">&gt;xgetttext --output=test.pot test.py</pre>
		<p>我们将wxPython界面以XRC文件保存了，那里同样有要翻译的字符串需要提取。用XRCed工具将XRC生成python代码，勾选上'Generate gettext strings'项即可。将源文件和XRC生成的test_xrc.py文件一起处理，生成一个test.pot。</p>
		<pre class="console">&gt;xgettext --output=test.pot test.py test_xrc.py</pre>
		<p>将得到的test.pot另存为test.po文件，然后进行翻译编辑，在这过程中文件需要使用utf-8编码。将对应的英文翻译成中文，将charset更改为utf-8。</p>
		<pre class="code">"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: test.py:19
msgid "XRC i18n Demo"
msgstr "XRC 国际化示例"
...</pre>
		<p>.pot和.po这些文件都是文本文件，主要供翻译者使用。为了使程序在运行时能获取相关的翻译的内容，要进行所谓的编译过程，将文本文件转换为二进制文件.mo。这里用了gettext工具集中的另一程序msgfmt。</p>
		<pre class="console">&gt; msgfmt --output=test.mo test.po</pre>
		<p>因为windows下没有像linux像有公共存储.mo文件的目录，保持平台的迁移性，在应用程序本地目录下新建locale目录，用来存放编译过的.mo文件，然后将test.mo移动至locale目录。在完成这些步骤后，就转入代码方面的更改了。</p>
		<h3>wxPython代码更改</h3>
		<p>原先的代码只需要做小改动：</p>
		<pre class="code">def OnInit(self):
    wx.Locale.AddCatalogLookupPathPrefix('locale')
    self.locale = wx.Locale(wx.LANGUAGE_CHINESE_SIMPLIFIED)
    self.locale.AddCatalog('test')
    import __builtin__
    __builtin__.__dict__['_'] = wx.GetTranslation</pre>
		<p>首先，增加了新的目录文件路径，这将使wxPython搜索这个目录，寻找匹配的.mo文件。接着创建wx.Locale对象，将其初始化为简体中文，这将对应于zh_CN。最后将wx.GetTranslation做了一全局映射，这样你在其他类中，比如示例中TestFrame也能使用_('xx')调用。这样wxPython的i18n工作就完成了，下面是翻译前后的界面截图。</p>
		<p>
				<a href="/images/cppblog_com/len/WindowsLiveWriter/wxPythonXRCi18n_10874/wxpython_2.png">
						<img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="400" alt="wxpython" src="http://www.cppblog.com/images/cppblog_com/len/WindowsLiveWriter/wxPythonXRCi18n_10874/wxpython_thumb.png" width="644" border="0" />
				</a>
		</p>
		<h3>一些有益的讨论</h3>
		<h4>.mo文件的查找目录</h4>
		<p>如果你将locale目录下的test.mo文件删除掉，然后将test.py中的wx.LANGUAGE_CHINESE_SIMPLIFIED改为wx.LANGUAGE_CHINESE，重新运行程序看看。发现界面变成了如下的繁体中文，但是菜单'档案'下的Exit还是英文。</p>
		<p>
				<a href="/images/cppblog_com/len/WindowsLiveWriter/wxPythonXRCi18n_10874/wxzh_2.png">
						<img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="77" alt="wxzh" src="http://www.cppblog.com/images/cppblog_com/len/WindowsLiveWriter/wxPythonXRCi18n_10874/wxzh_thumb.png" width="404" border="0" />
				</a>
		</p>
		<p>因为缺失.mo文件，但又指定wx.LANGUAGE_CHINESE，wxPython运行时使用了wxstd.mo文件。wxstd.mo有许多预编译好的常见字符串的对应关系，它随wxPython发布，在wx/locale下有许多语言版本的wxstd.mo。</p>
		<p>对于wxPython会对待查目录"DIR"来搜索.mo文件，查找它下面的这些目录,(DIR/LANG/LC_MESSAGES;DIR/LANG;DIR),对于哪些是待查目录，各个系统下又有不同，在所有的平台上,LC_PATH环境变量指定的目录将成为待查目录，在Linux下/share/locale, /usr/share/locale, /usr/lib/locale, /usr/locale /share/locale以及当前目录将是待查目录。在上面我们已经用过AddCatalogLookupPathPrefix()函数，其作用就是增加自己的待查目录。</p>
		<p>在示例程序中，将test.mo放在locale\zh_CN\LC_MESSAGES或者locale\zh\LC_MESSAGES同样是可行的。但是如果使用wx.LANGUAGE_CHINESE指定，则zh_CN目录将不可行，因为它只是特化目录，指简体中文，而zh目录同样适用。</p>
		<h4>工具链再讨论</h4>
		<p>gettext进行国际化是开源社区的主流方案，它也提供了许多实用工具供使用。上面提到了xgettext,msgfmt，还有msginit.exe，它将根据.pot文件创建新的.po文件，然后初始化一些元信息，像作者信息，项目，以及编码等，当然也可像上面的手工编辑。msgmerge.exe将两个.po文件进行合并。除了使用GNU Gettext工具集，也可使用随python发布的tool\i18n目录下pygettext.py和msgfmt.py，它们等同于上述的两个工具。</p>
		<p>对于编辑.po文件，可以尝试一下<a href="http://www.poedit.net/index.php">Poedit</a>,它提供了图形化的编辑环境，其他功能我就不清楚了。</p>
<img src ="http://www.cppblog.com/len/aggbug/56229.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/len/" target="_blank">len</a> 2008-07-15 20:21 <a href="http://www.cppblog.com/len/archive/2008/07/15/56229.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简单的QQ代理验证</title><link>http://www.cppblog.com/len/archive/2008/07/02/55174.html</link><dc:creator>len</dc:creator><author>len</author><pubDate>Wed, 02 Jul 2008 14:13:00 GMT</pubDate><guid>http://www.cppblog.com/len/archive/2008/07/02/55174.html</guid><wfw:comment>http://www.cppblog.com/len/comments/55174.html</wfw:comment><comments>http://www.cppblog.com/len/archive/2008/07/02/55174.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/len/comments/commentRss/55174.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/len/services/trackbacks/55174.html</trackback:ping><description><![CDATA[
		<p>QQ在许多公司内部被禁止使用,为了能使用QQ,稍微懂点儿计算机的人都知道用代理。QQ提供了socket和http代理这两种功能，socket代理功能强大，但一般公司对外允许连接的端口号比较有限，难以利用。大多数公司是允许连接外部的80端口的，这样使用QQ的http代理是可行的。但是找到能用的QQ代理有点儿麻烦，因此下面的Python代码提供了自动进行QQ代理验证的功能。</p>
		<pre class="code">import urllib2
import socket
import re

f = urllib2.urlopen('http://www.proxycn.com/html_proxy/http-1.html')
content = f.read()
f.close()
ipPattern = re.compile(r'(\d+\.\d+\.\d+\.\d+):80')
ipList = ipPattern.findall(content)
print ipList
requestData = "CONNECT http.tencent.com:443 HTTP/1.1\x0d\x0a"
requestData += "Accept: */*\x0d\x0aContent-Type: text/html\x0d\x0a"
requestData += "Proxy-Connection: Keep-Alive\x0d\x0a"
requestData += "Content-length: 0\x0d\x0a\x0d\x0a"
for ip in ipList:

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        s.connect((ip,80))
        s.send(requestData)
        data = s.recv(64)
        if data.find("200 Connection established")!= -1:
            print ip, 'good'
            # A vailable proxy is found once, then exit the program
            s.close
            exit(0)
        else:
            print ip, 'bad'
    except socket.error:
        print ip, 'dead'
    finally:
        s.close</pre>
		<p>程序在找到一个可用的QQ代理后退出，用good标识。另两种代理服务器的状态是dead,说明本地无法连接到代理服务器，或是bad，能与代理服务器建立连接，但是代理不能与QQ服务器通讯。</p>
		<h3>代码思路</h3>
		<p>通过<a href="http://www.proxycn.com/index.php">代理中国</a>获取到80端口的代理服务器列表，使用了urllib2模块获取页面数据，然后正则表达式解析出80端口的IP地址存入list中。接下来的几行代码简单，但是很重要，使用较为底层的socket对象，构造合适的数据包通过代理，请求与QQ服务器连接，通过读取的返回数据包来验证连接是否能建立。</p>
		<p>这里主要涉及到了HTTP协议的CONNECT的概念，很多人可能认为http代理只是为web浏览提供服务，其实CONNECT方法允许允许用户建立TCP连接到任何端口，这意味着代理不仅可用于HTTP，还可用于FTP，QQ等其他协议。只是网上提供CONNECT方法的代理服务器比较少，我有时候扫了一大堆，也没有找到一个可用的代理。反过来说，有时候你找到的能浏览网页的http服务器，未必能用在QQ上，QQ需要的是能CONNECT的代理。网页浏览一般只使用HTTP协议的GET或POST方法，提供这两种方法的服务器就多了。</p>
		<p>了解了代码的原理，稍做改动，就可以用于其他类型的代理的验证了，需要的是一些基本网络知识和数据报的发送和接收。</p>
<img src ="http://www.cppblog.com/len/aggbug/55174.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/len/" target="_blank">len</a> 2008-07-02 22:13 <a href="http://www.cppblog.com/len/archive/2008/07/02/55174.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(翻译)Python标准库的threading.Thread类</title><link>http://www.cppblog.com/len/archive/2008/06/24/54472.html</link><dc:creator>len</dc:creator><author>len</author><pubDate>Tue, 24 Jun 2008 08:54:00 GMT</pubDate><guid>http://www.cppblog.com/len/archive/2008/06/24/54472.html</guid><wfw:comment>http://www.cppblog.com/len/comments/54472.html</wfw:comment><comments>http://www.cppblog.com/len/archive/2008/06/24/54472.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/len/comments/commentRss/54472.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/len/services/trackbacks/54472.html</trackback:ping><description><![CDATA[
		<p>这个类表示在单独的控制线程中运行的活动。有两种方法可以指定这种活动，给构造函数传递回调对象，或者在子类中重写<tt>run() </tt>方法。其他方法（除了构造函数)都不应在子类中被重写。换句话说，在子类中只有<tt>__init__()</tt>和<tt>run()</tt>方法被重写。 </p>
		<p>一旦线程对象被创建，它的活动需要通过调用线程的start()方法来启动。这方法再调用控制线程中的run方法。 </p>
		<p>一旦线程被激活，则这线程被认为是'alive'(活动)。当它的run()方法终止时-正常退出或抛出未处理的异常，则活动状态停止。<tt>isAlive()</tt>方法测试线程是否是活动的。 </p>
		<p>一个线程能调用别的线程的<tt>join()</tt>方法。这将阻塞调用线程，直到拥有<tt>join()</tt>方法的线程的调用终止。 </p>
		<p>线程有名字。名字能传给构造函数，通过<tt>setName()</tt>方法设置，用<tt>getName()</tt>方法获取。 </p>
		<p>线程能被标识为'daemon thread'(守护线程).这标志的特点是当剩下的全是守护线程时，则Python程序退出。它的初始值继承于创建线程。这标志用<tt>setDaemon()</tt>方法设置，用<tt>isDaemon()</tt>获取。 </p>
		<p>存在'main thread'(主线程),它对应于Python程序的初始控制线程。它不是后台线程。 </p>
		<p>有可能存在'dummy thread objects'(哑线程对象)被创建。这些线程对应于'alien threads'(外部线程),它们在Python的线程模型之外被启动，像直接从C语言代码中启动。哑线程对象只有有限的功能，它们总是被认为是活动的，守护线程，不能使用<tt>join()</tt>方法。它们从不能被删除，既然它无法监测到外部线程的中止。</p>
		<dl>
				<dt>
						<tt>class Thread(<var>group=None, target=None, name=None, args=(), kwargs={}</var>)</tt>
				</dt>
				<dd>
						<p>构造函数能带有关键字参数被调用。这些参数是:</p>
						<p>
								<var>group</var> 应当为 None，为将来实现<tt>ThreadGroup</tt>类的扩展而保留。</p>
						<p>
								<var>target</var> 是被 <tt>run()</tt>方法调用的回调对象. 默认应为None, 意味着没有对象被调用。</p>
						<p>
								<var>name</var> 为线程名字。默认，形式为'Thread-<var>N</var>'的唯一的名字被创建，其中<var>N</var> 是比较小的十进制数。</p>
						<p>
								<var>args</var>是目标调用参数的tuple，默认为()。</p>
						<p>
								<var>kwargs</var>是目标调用的参数的关键字dictionary，默认为{}。</p>
						<p>如果子线程重写了构造函数，它应保证调用基类的构造函数<tt>(Thread.__init__())</tt>，在线程中进行其他工作之前。</p>
				</dd>
				<dt>
						<tt>start()</tt>
				</dt>
				<dd>启动线程活动。 
<p>在每个线程对象中最多被调用一次。它安排对象的<tt>run()</tt> 被调用在一单独的控制线程中。</p></dd>
				<dt>
				</dt>
				<p>
						<tt>run()</tt>
				</p>
				<dd>用以表示线程活动的方法。
</dd>
				<dd>
						<p>你可能在子类重写这方法。标准的 <tt>run()</tt>方法调用作为<var>target</var>传递给对象构造函数的回调对象。如果存在参数，一系列关键字参数从<var>args</var>和<var>kwargs参数相应地起作用。</var></p>
				</dd>
				<dt>
						<tt>join([<var>timeout</var>])</tt>
				</dt>
				<dd>等待至线程中止。这阻塞调用线程直至线程的<tt>join()</tt> 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。
</dd>
				<dd>
						<p>当<var>timeout</var>参数未被设置或者不是<code>None</code>,它应当是浮点数指明以秒计的操作超时值。因为<tt>join()</tt>总是返回<code>None</code>，你必须调用<tt>isAlive()</tt>来判别超时是否发生。</p>
				</dd>
				<dd>
						<p>当<var>timeout</var> 参数没有被指定或者是<code>None</code>时，操作将被阻塞直至线程中止。</p>
				</dd>
				<dd>
						<p>线程能被<tt>join()许多次。</tt></p>
				</dd>
				<dd>
						<p>线程不能调用自身的<tt>join()，因为这将会引起死锁。</tt></p>
				</dd>
				<dd>
						<p>在线程启动之前尝试调用<tt>join()</tt>会发生错误。</p>
				</dd>
				<dt>
						<tt>getName()</tt>
				</dt>
				<dd>返回线程名。 
</dd>
				<dt>
						<tt>setName(<var>name</var>)</tt>
				</dt>
				<dd>设置线程名。 
</dd>
				<dd>
						<p>这名字是只用来进行标识目的的字符串。它没有其他作用。多个线程可以取同一名字。最初的名字通过构造函数设置。 </p>
				</dd>
				<dt>
						<tt>isAlive()</tt>
				</dt>
				<dd>返回线程是否活动的。
</dd>
				<dd>
						<p>大致上，线程从 <tt>start()</tt>调用开始那点至它的<tt>run()</tt>方法中止返回时，都被认为是活动的。模块函数<tt>enumerate()返回活动线程的列表。</tt></p>
				</dd>
				<dt>
						<tt>isDaemon()</tt>
				</dt>
				<dd>返回线程的守护线程标志。
</dd>
				<dt>
						<tt>setDaemon(<var>daemonic</var>)</tt>
				</dt>
				<dd>设置守护线程标志为布尔值<var>daemonic</var>。它必须在<tt>start()</tt>调用之前被调用。
</dd>
				<dd>
						<p>初始值继承至创建线程。</p>
				</dd>
				<dd>
						<p>当没有活动的非守护线程时，整个Python程序退出。</p>
				</dd>
		</dl>
		<p>
				<strong>参见</strong>:<a href="http://docs.python.org/lib/thread-objects.html">Python Library Reference</a></p>
<img src ="http://www.cppblog.com/len/aggbug/54472.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/len/" target="_blank">len</a> 2008-06-24 16:54 <a href="http://www.cppblog.com/len/archive/2008/06/24/54472.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Say Hello to Glade</title><link>http://www.cppblog.com/len/archive/2008/03/27/45548.html</link><dc:creator>len</dc:creator><author>len</author><pubDate>Thu, 27 Mar 2008 12:49:00 GMT</pubDate><guid>http://www.cppblog.com/len/archive/2008/03/27/45548.html</guid><wfw:comment>http://www.cppblog.com/len/comments/45548.html</wfw:comment><comments>http://www.cppblog.com/len/archive/2008/03/27/45548.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/len/comments/commentRss/45548.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/len/services/trackbacks/45548.html</trackback:ping><description><![CDATA[
		<p>Glade是针对GTK+工具箱与GNOME桌面开发环境的快速图形界面开发工具.用Glade设计的用户接口以XML的文件形式保存,然后根据需要由程序通过libglade库文件来动态加载.因为使用了libglade库,Glade XML文件能够被C,C++,Java,Perl,Python,C#等等语言所支持.针对其他未涉及的语言的支持也是方便的.</p>
		<p>在网上可以见到某些关于Glade的教程,大都是关于Linux平台和Glade 2的,因为原先Glade作为快速开发工具,集成代码生成功能,生成C文件.所以常常有初学者对网上某些教程所提及的"generate"(生成代码)功能表示迷惑,在新版本的Glade-3上找不到对应的功能.</p>
		<p>新版本的Glade-3是对原先Glade代码的完全重写.一个显著的变化就是去除了代码生成功能.这样做是有原因的,即然代码生成功能不被提倡使用,而是更鼓励使用libglade功能.但是如果你真需要代码生成功能的话,它还是可以做为插件来提供的.另一个显著的不同是glade-3设计用来最大化使用GObject的自省机制(GObject introspection),来使外部工具箱和部件的控制,信号和属性的集成更加容易.</p>
		<p>如果看过<a href="/len/archive/2008/03/23/45190.html">Say Hello to GTK+</a>的话，可能感觉那样的窗体程序太简单了．那么现在让我们借助Glade弄点儿复杂一点儿的界面吧．首先来瞧瞧Glade长什么样,下图就是Glade在windows下的界面.左边的窗体的小部件选择器，相当于调色板．中间是主菜单，右边的是属性窗体．</p>
		<p>
				<a href="/images/cppblog_com/len/WindowsLiveWriter/SayHellotoGlade_13792/glade_win_6.jpg">
						<img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="474" alt="glade_win" src="http://www.cppblog.com/images/cppblog_com/len/WindowsLiveWriter/SayHellotoGlade_13792/glade_win_thumb_2.jpg" width="644" border="0" />
				</a>
		</p>
		<p>现在开始创建一个类似于文本编辑器的图形界面．按照上图标注的顺序，依次添加window部件，vertical box部件,menu bar部件,text view部件和Status部件.vertical box设置三行，它是用来进行界面布局，分割空间用，这是gtk+设计与传统的windows UI设计很不同的地方．后三个部件是放置vertical box中的，最后设计完成图形如下．保存取名为win.glade.如果你感兴趣的话，可以用文件编辑器打开这个文件看看，正如所说的那样，它是一个xml格式的文本文件．</p>
		<p>
				<a href="/images/cppblog_com/len/WindowsLiveWriter/SayHellotoGlade_13792/win_2.jpg">
						<img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="204" alt="win" src="http://www.cppblog.com/images/cppblog_com/len/WindowsLiveWriter/SayHellotoGlade_13792/win_thumb.jpg" width="319" border="0" />
				</a>
		</p>
		<p>现在我们设置相关的头文件和库文件，编辑一个glade.c文件，添加进以下的代码，运行看看，会出现如上图的对话框．虽然这个对话框什么都不干，但是通过Glade，我们能较为容易地设计界面，而不用通过gtk函数，一个一个将控件实现.</p>
		<pre class="code">#include &lt;gtk/gtk.h&gt;<br />#include &lt;glade/glade.h&gt;
int main(int argc, char* argv[])
{
	GladeXML        *gxml;
	GtkWidget       *window;

	gtk_init (&amp;argc, &amp;argv);
	gxml = glade_xml_new ("win.glade", NULL, NULL);
	window = glade_xml_get_widget (gxml, "hello");
	g_object_unref (G_OBJECT (gxml));
	gtk_widget_show (window);                
	gtk_main ();

	return 0;
}

</pre>
<img src ="http://www.cppblog.com/len/aggbug/45548.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/len/" target="_blank">len</a> 2008-03-27 20:49 <a href="http://www.cppblog.com/len/archive/2008/03/27/45548.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>初识PyGTK</title><link>http://www.cppblog.com/len/archive/2008/03/12/44296.html</link><dc:creator>len</dc:creator><author>len</author><pubDate>Wed, 12 Mar 2008 11:43:00 GMT</pubDate><guid>http://www.cppblog.com/len/archive/2008/03/12/44296.html</guid><wfw:comment>http://www.cppblog.com/len/comments/44296.html</wfw:comment><comments>http://www.cppblog.com/len/archive/2008/03/12/44296.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/len/comments/commentRss/44296.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/len/services/trackbacks/44296.html</trackback:ping><description><![CDATA[
		<style type="text/css"><![CDATA[
pre { 
  padding: 0.5em; 
  margin: 1em 1em; 
  font-weight: bold;
  background: #eeeeee;
  border: solid 1px #aaaaaa;
}
]]&gt;</style>
		<p>PyGTK让你用Python轻松创建具有图形用户界面的程序.底层的GTK+提供了各式的可视元素和功能,如果需要,你能开发在GNOME桌面系统运行的功能完整的软件.</p>
		<p>PyGTK真正具有跨平台性,它能不加修改地,稳定运行各种操作系统之上,如Linux,Windows,MacOS等.除了简单易用和快速的原型开发能力外,PyGTK还有一流的处理本地化语言的独特功能.</p>
		<p>PyGTK是自由软件,所以你能几乎没有任何限制的使用，修改，分发，研究它，它是基于LGPL协议发布的．</p>
		<p>如果你对上面提到的GTK+,也不了解的话，那允许再对它也进行一番介绍．GTK+，用C语言开发的，具有跨平台的GUI库，它是GNOME桌面系统(如果你在用Linux，一定不陌生)和GIMP图象编辑器的开发工具箱．它是世界上许多程序员的选择，对他们来说，国际化的支持是必要的，而且性能也总是他们考虑的因素．与GTK同一领域的还有Qt库，它是由商业公司开发的C++图形库，虽然它也有免费的．</p>
		<p>
				<strong>在windows平台的安装和开发</strong>
		</p>
		<p>安装PyGTK只需执行下列步骤：</p>
		<ul>
				<li>安装Python2.4或以上的windows版本<a href="http://www.python.org]">[www.python.org]</a></li>
				<li>从GTK+/Glade的windows版本的GTK+ 2.10开发运行时环境<a href="http://gladewin32.sourceforge.net/modules/wfdownloads/viewcat.php?cid=14">[gladewin32.sourceforge.net]</a></li>
				<li>从PyGTK网站下载安装PyCairo,PyGobject和PyGTK安装包，注意这些需全部安装才能使PyGTK工作<a href="http://pygtk.org/downloads.html">[pygtk.org]</a></li>
		</ul>
		<p>或许你对这些步骤还感到麻烦，或者对Python不熟悉的话，那也没有关系，直接下载一键安装包<a href="http://osl.ulpgc.es/~arc/gnome/pygtk-setup.exe">all-in-one installer</a>,为你配置好全部运行时环境．</p>
		<p>看看开发环境是否配置正确，将下列代码作为Python脚本或者在Python交互控制台下输入．如果正确的话，应该有一个标题为"Hello World"的windows的空窗口呈现在你面前．</p>
		<p>如果不能运行的话，有可能会出现一个不能成功加载dll的错误提示，这是因为缺少iconv.dll．这时需要只需从网上下载过来，拷贝至windows/system32目录下即可了.</p>
		<pre class="code">
import gtk
window = gtk.Window()
window.set_title("Hello World")
window.show_all()

gtk.main()
</pre>
<img src ="http://www.cppblog.com/len/aggbug/44296.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/len/" target="_blank">len</a> 2008-03-12 19:43 <a href="http://www.cppblog.com/len/archive/2008/03/12/44296.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>