<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>pangwa&#039;s Blog &#187; python</title>
	<atom:link href="http://blog.pangwa.com/tag/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.pangwa.com</link>
	<description>Always be pangwa</description>
	<lastBuildDate>Sat, 06 Aug 2011 15:21:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
	<atom:link rel='hub' href='http://blog.pangwa.com/?pushpress=hub'/>
		<item>
		<title>在windows下构建PyGTK程序的步骤</title>
		<link>http://blog.pangwa.com/2006/12/05/%e5%9c%a8windows%e4%b8%8b%e6%9e%84%e5%bb%bapygtk%e7%a8%8b%e5%ba%8f%e7%9a%84%e6%ad%a5%e9%aa%a4/</link>
		<comments>http://blog.pangwa.com/2006/12/05/%e5%9c%a8windows%e4%b8%8b%e6%9e%84%e5%bb%bapygtk%e7%a8%8b%e5%ba%8f%e7%9a%84%e6%ad%a5%e9%aa%a4/#comments</comments>
		<pubDate>Tue, 05 Dec 2006 22:12:00 +0000</pubDate>
		<dc:creator>pangwa</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://blog.pangwa.com/?p=159</guid>
		<description><![CDATA[&#160;&#160; 忽然想到在windows下搭建起PyGTK程序也挺麻烦, 自己先试着一步步的走一遍, 以方便后人,&#160;&#160; 在本文中我们使用Python2.5的版本. &#160;&#160; 首先需要下载Python的2.5版本, 它可以在这里下载到(http://www.python.org/download/). 下载完成后安装. &#160;&#160; 然后需要下载并安装PyObjects, PyGTK, pycario(这些都要for python2.5的版本),可以分别在http://ftp.gnome.org/pub/GNOME/binaries/win32/pygobject/2.12/http://ftp.gnome.org/pub/GNOME/binaries/win32/pygtk/2.10/http://ftp.gnome.org/pub/GNOME/binaries/win32/pycairo/1.2/ 里下载到, 下载并安装. &#160;&#160; 然后需要glade和Gtk-2.0的runtime, 可以在http://gladewin32.sourceforge.net 找到, 下载它的dev安装包,我使用的是它的2.10版本根据情况可以下载新版本. 下载完毕安装.&#160;&#160; &#160;&#160; 好了, 到了这里您的PyGtk程序应该可以运行了,赶快试试我们前面例子里的程序吧:) &#160;&#160; 看看我的程序在windows下的截图:)]]></description>
			<content:encoded><![CDATA[<p>&nbsp;&nbsp; 忽然想到在windows下搭建起PyGTK程序也挺麻烦, 自己先试着一步步的走一遍, 以方便后人,<br />&nbsp;&nbsp; 在本文中我们使用Python2.5的版本. <br />&nbsp;&nbsp; 首先需要下载Python的2.5版本, 它可以在<a href="http://www.python.org/ftp/python/2.5/python-2.5.msi" target="_blank">这里</a>下载到(http://www.python.org/download/). 下载完成后安装. <br />&nbsp;&nbsp; 然后需要下载并安装PyObjects, PyGTK, pycario(这些都要for python2.5的版本),可以分别在<a href="http://ftp.gnome.org/pub/GNOME/binaries/win32/pygobject/2.12/" target="_blank">http://ftp.gnome.org/pub/GNOME/binaries/win32/pygobject/2.12/</a><br /><a href="http://ftp.gnome.org/pub/GNOME/binaries/win32/pygtk/2.10/" target="_blank">http://ftp.gnome.org/pub/GNOME/binaries/win32/pygtk/2.10/</a><br /><a href="http://ftp.gnome.org/pub/GNOME/binaries/win32/pycairo/1.2/" target="_blank">http://ftp.gnome.org/pub/GNOME/binaries/win32/pycairo/1.2/</a> 里下载到, 下载并安装. <br />&nbsp;&nbsp; 然后需要glade和Gtk-2.0的runtime, 可以在<a href="http://gladewin32.sourceforge.net/" target="_blank">http://gladewin32.sourceforge.net</a> 找到, 下载它的dev安装包,我使用的是它的2.10版本根据情况可以下载新版本. 下载完毕安装.<br />&nbsp;&nbsp; <br />&nbsp;&nbsp; 好了, 到了这里您的PyGtk程序应该可以运行了,赶快试试我们前面例子里的程序吧:) <br />&nbsp;&nbsp; 看看我的程序在windows下的截图:) 
<div align="center"><img src="http://blogimg.chinaunix.net/blog/upfile/061205220932.png" onload="javascript:if(this.width>500)this.width=500;&#8221; border=&#8221;0&#8243;>
<div style="text-align: left;">&nbsp;&nbsp;&nbsp; 这是我的程序的源码和glade文件, 它只是简单的使用了第一个例子中的一些代码:) <br />
<table style="border-collapse: collapse;" align="center" border="1" bordercolor="#dddddd" cellpadding="0" cellspacing="0" width="360">
<tbody>
<tr height="60">
<td align="center" width="60"><img src="/fileicon/zip.gif" alt="" border="0"></td>
<td>
<table style="border-collapse: collapse;" border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr height="20">
<td align="center" width="40">文件:</td>
<td>demo.zip</td>
</tr>
<tr height="20">
<td align="center" width="40">大小:</td>
<td>1KB</td>
</tr>
<tr height="20">
<td align="center" width="40">下载:</td>
<td><a href="http://blogimg.chinaunix.net/blog/upfile/061205221026.zip">下载</a></td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>&nbsp;&nbsp; 好了, 如果你已经可以运行我的示例程序, 那么你的PyGTk环境就搭建成功了, 快开始你的PyGTK之旅吧:)</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark to:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fblog.pangwa.com%2F2006%2F12%2F05%2F%25e5%259c%25a8windows%25e4%25b8%258b%25e6%259e%2584%25e5%25bb%25bapygtk%25e7%25a8%258b%25e5%25ba%258f%25e7%259a%2584%25e6%25ad%25a5%25e9%25aa%25a4%2F&amp;title=%E5%9C%A8windows%E4%B8%8B%E6%9E%84%E5%BB%BAPyGTK%E7%A8%8B%E5%BA%8F%E7%9A%84%E6%AD%A5%E9%AA%A4" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.pangwa.com%2F2006%2F12%2F05%2F%25e5%259c%25a8windows%25e4%25b8%258b%25e6%259e%2584%25e5%25bb%25bapygtk%25e7%25a8%258b%25e5%25ba%258f%25e7%259a%2584%25e6%25ad%25a5%25e9%25aa%25a4%2F&amp;title=%E5%9C%A8windows%E4%B8%8B%E6%9E%84%E5%BB%BAPyGTK%E7%A8%8B%E5%BA%8F%E7%9A%84%E6%AD%A5%E9%AA%A4" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fblog.pangwa.com%2F2006%2F12%2F05%2F%25e5%259c%25a8windows%25e4%25b8%258b%25e6%259e%2584%25e5%25bb%25bapygtk%25e7%25a8%258b%25e5%25ba%258f%25e7%259a%2584%25e6%25ad%25a5%25e9%25aa%25a4%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fblog.pangwa.com%2F2006%2F12%2F05%2F%25e5%259c%25a8windows%25e4%25b8%258b%25e6%259e%2584%25e5%25bb%25bapygtk%25e7%25a8%258b%25e5%25ba%258f%25e7%259a%2584%25e6%25ad%25a5%25e9%25aa%25a4%2F&amp;title=%E5%9C%A8windows%E4%B8%8B%E6%9E%84%E5%BB%BAPyGTK%E7%A8%8B%E5%BA%8F%E7%9A%84%E6%AD%A5%E9%AA%A4" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fblog.pangwa.com%2F2006%2F12%2F05%2F%25e5%259c%25a8windows%25e4%25b8%258b%25e6%259e%2584%25e5%25bb%25bapygtk%25e7%25a8%258b%25e5%25ba%258f%25e7%259a%2584%25e6%25ad%25a5%25e9%25aa%25a4%2F&amp;title=%E5%9C%A8windows%E4%B8%8B%E6%9E%84%E5%BB%BAPyGTK%E7%A8%8B%E5%BA%8F%E7%9A%84%E6%AD%A5%E9%AA%A4" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fblog.pangwa.com%2F2006%2F12%2F05%2F%25e5%259c%25a8windows%25e4%25b8%258b%25e6%259e%2584%25e5%25bb%25bapygtk%25e7%25a8%258b%25e5%25ba%258f%25e7%259a%2584%25e6%25ad%25a5%25e9%25aa%25a4%2F&amp;title=%E5%9C%A8windows%E4%B8%8B%E6%9E%84%E5%BB%BAPyGTK%E7%A8%8B%E5%BA%8F%E7%9A%84%E6%AD%A5%E9%AA%A4" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fblog.pangwa.com%2F2006%2F12%2F05%2F%25e5%259c%25a8windows%25e4%25b8%258b%25e6%259e%2584%25e5%25bb%25bapygtk%25e7%25a8%258b%25e5%25ba%258f%25e7%259a%2584%25e6%25ad%25a5%25e9%25aa%25a4%2F&amp;t=%E5%9C%A8windows%E4%B8%8B%E6%9E%84%E5%BB%BAPyGTK%E7%A8%8B%E5%BA%8F%E7%9A%84%E6%AD%A5%E9%AA%A4" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://blog.pangwa.com/2006/12/05/%e5%9c%a8windows%e4%b8%8b%e6%9e%84%e5%bb%bapygtk%e7%a8%8b%e5%ba%8f%e7%9a%84%e6%ad%a5%e9%aa%a4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用PyGtk和Glade构建应用程序</title>
		<link>http://blog.pangwa.com/2006/08/19/%e4%bd%bf%e7%94%a8pygtk%e5%92%8cglade%e6%9e%84%e5%bb%ba%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f/</link>
		<comments>http://blog.pangwa.com/2006/08/19/%e4%bd%bf%e7%94%a8pygtk%e5%92%8cglade%e6%9e%84%e5%bb%ba%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f/#comments</comments>
		<pubDate>Sat, 19 Aug 2006 17:28:00 +0000</pubDate>
		<dc:creator>pangwa</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://blog.pangwa.com/?p=136</guid>
		<description><![CDATA[使用PyGtk和Glade构建应用程序 &#160;&#160;原文&#160; &#160;在使用PyGTK和Glade完成了我的第一个例子后, 我决定写一个更加复杂的例子, 但是我写不出一个好的题目来. (注: 我很乐意听到你对任何例子或帖子有任何建议), 于是我决定写一个简单的程序或许会从这里找出一些有用的主题来.&#160; 我的想法是创建一个可以让我记录我喝过酒的种类以及我对它们的喜好程度. 我写想这个程序很久了, 因此我想把学习PyGTK和写它结合起来会是一个好主意.&#160; 我把这个项目命名为PyWine. 本例程的全部代码和Glade文件可以从这里下载.&#160;&#160; 文件: PyWine.tar.tar 大小: 30KB 下载: 下载 &#160;&#160; 我们要做的第一件事情是在项目目录下创建一个名为PyWine的新Glade项目. 然后创建一个名为”mainWindow”的窗口, 并把它的标题设置成”PyWine”. 然后像在例程1里那样为它添加一个销毁的信息处理器.&#160;&#160; 然后我添加了一个有4行的垂直盒子(Vertical Box), (从上到下): 一行放置菜单栏,一行放工具栏,一行放一个树状或列表视图, 最后一行旋转一个状态栏. 把树状视图命名为”wineView”. 500)this.width=500;&#8221; border=0> &#160;&#160; 现在我们要为tbAddWine按钮添加一个点击事件的处理器, 这次我们不使用默认的名字,把它命名为”on_AddWine”. 添加菜单栏 &#160;&#160; 现在我们要对菜单作一些修改了, 因为我们希望人们既能够通过工具栏按钮或是通过菜单栏添加酒的条目. 那么就点击窗口上的菜单栏然后转到属性窗口中的物件标签页, 然后点”编辑菜单…”按钮来编辑菜单栏. (译注: 这里没有讲怎么往窗口添加菜单栏, 和添加工具栏一样, 从glade的面板里找:D).&#160;&#160;&#160; 现在点击”添加”按钮来添加一个新的根菜单项, 把它的标签设置成”_Add”. 然后在菜单列表中选择这个”Add”项然后点击”添加子项”(Add Child)按钮, 这就会为Add菜单创建一个子菜单. 把这个新的菜单项的标签设置成”_Wine”并把它的事件处理器设成”on_AddWine”.&#160;&#160; 你可能会注意到工具栏按钮Add的点击事件处理器和菜单Add&#124;Wine的点击事件处理器是一样的. 这是因为这两个物件都是要进行同样的任务: 往酒列表中添加酒的条目. 500)this.width=500;&#8221; [...]]]></description>
			<content:encoded><![CDATA[<div align=center><font size=5><strong></p>
<div align=center>
<div align=center>使用PyGtk和Glade构建应用程序</strong></font></div>
</div>
</div>
<div>&nbsp;&nbsp;<a href="http://www.learningpython.com/2006/05/30/building-an-application-with-pygtk-and-glade/" target=_blank>原文</a>&nbsp;</div>
<div>&nbsp;在使用PyGTK和Glade完成了我的第一个例子后, 我决定写一个更加复杂的例子, 但是我写不出一个好的题目来. (注: 我很乐意听到你对任何例子或帖子有任何建议), 于是我决定写一个简单的程序或许会从这里找出一些有用的主题来.<br />&nbsp; 我的想法是创建一个可以让我记录我喝过酒的种类以及我对它们的喜好程度. 我写想这个程序很久了, 因此我想把学习PyGTK和写它结合起来会是一个好主意.<br />&nbsp; 我把这个项目命名为PyWine. 本例程的全部代码和Glade文件可以从这里下载.<br />&nbsp;&nbsp; </div>
<div>
<table style="BORDER-COLLAPSE: collapse" borderColor=#dddddd cellSpacing=0 cellPadding=0 width=360 align=center border=1>
<tbody>
<tr height=60>
<td align=middle width=60><img alt="" src="http://control.cublog.cn/fileicon/zip.gif" border=0></td>
<td>
<table style="BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=0 width="100%" border=0>
<tbody>
<tr height=20>
<td align=middle width=40>文件:</td>
<td>PyWine.tar.tar</td>
</tr>
<tr height=20>
<td align=middle width=40>大小:</td>
<td>30KB</td>
</tr>
<tr height=20>
<td align=middle width=40>下载:</td>
<td><a href="http://www.cublog.cn/u/5462/upfile/060819164119.tar">下载</a></td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</div>
<p>&nbsp;&nbsp; 我们要做的第一件事情是在项目目录下创建一个名为PyWine的新Glade项目. 然后创建一个名为”mainWindow”的窗口, 并把它的标题设置成”PyWine”. 然后像在例程1里那样为它添加一个销毁的信息处理器.<br />&nbsp;&nbsp; 然后我添加了一个有4行的垂直盒子(Vertical Box), (从上到下): 一行放置菜单栏,一行放工具栏,一行放一个树状或列表视图, 最后一行旋转一个状态栏. 把树状视图命名为”wineView”.</p>
<div align=center><img src="http://www.cublog.cn/u/5462/upfile/060819164204.png" onload="javascript:if(this.width>500)this.width=500;&#8221; border=0></div>
<div align=left>&nbsp;&nbsp; 我们刚添加的树形/列表视图会用来显示酒的信息. 因此我们要做的第一件事就是我们应当允许用户往对话框里添加一种酒. 我们需要使用一个菜单命令和工具栏按钮来完成这个任务.<br />&nbsp;&nbsp; 首先添加一个工具栏按钮. 这只需要简单的在控件面板里选择”工具栏按钮”控件然后再点击我们往窗口里添加的工具栏. 这应该会往工具栏里添加一个样子很奇怪的按钮. 现在我们需要在”物件标签”(widget tab)来编辑这个工具栏按钮的属性. 我们把它的名字设置成”tbAddWine”, 图标设置成一个带加号的图标. (译注: 下面的图片可能与glade版本相关, 我这的图标名称为gtk-add, 请根据需要自己作少许变更:D).</div>
<div align=left>&nbsp;</p>
<div align=center><img src="http://www.cublog.cn/u/5462/upfile/060819164239.png" onload="javascript:if(this.width>500)this.width=500;&#8221; border=0></div>
</div>
<div align=left>&nbsp;&nbsp; 现在我们要为tbAddWine按钮添加一个点击事件的处理器, 这次我们不使用默认的名字,把它命名为”on_AddWine”.</div>
<h4 align=left>添加菜单栏</h4>
<div align=left>&nbsp;&nbsp; 现在我们要对菜单作一些修改了, 因为我们希望人们既能够通过工具栏按钮或是通过菜单栏添加酒的条目. 那么就点击窗口上的菜单栏然后转到属性窗口中的物件标签页, 然后点”编辑菜单…”按钮来编辑菜单栏. (译注: 这里没有讲怎么往窗口添加菜单栏, 和添加工具栏一样, 从glade的面板里找:D).<br />&nbsp;&nbsp;&nbsp; 现在点击”添加”按钮来添加一个新的根菜单项, 把它的标签设置成”_Add”. 然后在菜单列表中选择这个”Add”项然后点击”添加子项”(Add Child)按钮, 这就会为Add菜单创建一个子菜单. 把这个新的菜单项的标签设置成”_Wine”并把它的事件处理器设成”on_AddWine”.<br />&nbsp;&nbsp; 你可能会注意到工具栏按钮Add的点击事件处理器和菜单Add|Wine的点击事件处理器是一样的. 这是因为这两个物件都是要进行同样的任务: 往酒列表中添加酒的条目.</div>
<p align=center><img src="http://www.cublog.cn/u/5462/upfile/060819164512.png" onload="javascript:if(this.width>500)this.width=500;&#8221; border=0></p>
<div align=left>&nbsp;&nbsp; 因此当用户点Add Wine按钮或是从菜单中选择Add|Wine时要发生就是弹出一个可以让用户添加一些有关酒详细信息的对话框. 如果他们最后选择Ok按钮那么就把他们输入的酒的信息添加进列表视图中.</div>
<h4 align=left>创建对话框</h4>
<div align=left>&nbsp;&nbsp; 所以接下来我们要做的是创建一个可以让用户添加酒的对话框. 在这个例子中我们尽量让事情保持简单: 仅仅让用户输入酒的名字, 生产厂家, 装瓶的年代以及葡萄的类别.<br />&nbsp;&nbsp; 因此我们仅要通过点击Glade面板上的对话框按钮来创建一个新的对话框. 这就会弹出一个新建对话框窗口, 在里面选择包含Cancel和Ok按钮的”标准按钮布局”选项. 把对话框的名字设置成”wineDlg”, 窗口标题设置成”Add Wine”.<br />接下来我们要用一个表格来布置winedlg中的东西. 向对话框中添加表格(和通常添加物件的方法相同), 并把行数设成4, 列数设置成2. 然后我们就要用标签和文字输入物件来填充表格的空隙直到它看起来像这样:</div>
<div align=left></p>
<div align=center><img src="http://www.cublog.cn/u/5462/upfile/060819164844.png" onload="javascript:if(this.width>500)this.width=500;&#8221; border=0></div>
</div>
<div align=left>&nbsp;&nbsp;&nbsp; 我在表格的行间增加了3个像素的间隔, 这个设置可以在表格属性的物件标签页里找到. 如果你正在为怎么选择这个表格而犯愁, 你可以通过选择glade主窗口中的菜单栏”视图 | 显示物件树”(View|Show widget Tree). 或者按下shift键, 然后左键点击表格上的物件, 这会让你在这个对话框中的所有物件间循环.<br />&nbsp;&nbsp;&nbsp; 现在我们要编辑这个对话框中的所有东西, 把它们命名为: enWine, enWinery, enGrape和enYear.</div>
<h4 align=left>Python代码</h4>
<div align=left>&nbsp;&nbsp; 现在我们要写一些让它工作的代码了. 我们把这个python文件命名为pywine.py, 把它放在/projects/Pywine目录中(和我们创建glade文件的目录相同). 下面是我们要用到的基本代码(大部分都是从上一个例程&lt;<a href="http://www.learningpython.com/2006/05/07/creating-a-gui-using-pygtk-and-glade/" target=_blank>使用PyGTK和Glade创建用户界面</a>&gt;中拿来的).</p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
<tbody>
<tr>
<td>
<pre><span class=hl-comment><font color=#ff0000>#!/usr/bin/env python

</font></span><span class=hl-reserved><font color=#0000ff>import </font></span><span class=hl-identifier>sys

</span><span class=hl-reserved><font color=#0000ff>try</font></span><span class=hl-default>:

 </span><span class=hl-reserved><font color=#0000ff>import </font></span><span class=hl-identifier>pygtk

  pygtk</span><span class=hl-default>.</span><span class=hl-identifier>require</span><span class=hl-brackets>(</span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>2.0</span><span class=hl-quotes>"</span></font><span class=hl-brackets>)

</span><span class=hl-reserved><font color=#0000ff>except</font></span><span class=hl-default>:

  </span><span class=hl-reserved><font color=#0000ff>pass

try</font></span><span class=hl-default>:

</span><span class=hl-reserved><font color=#0000ff>import </font></span><span class=hl-identifier>gtk

  </span><span class=hl-reserved><font color=#0000ff>import </font></span><span class=hl-identifier>gtk</span><span class=hl-default>.</span><span class=hl-identifier>glade

</span><span class=hl-reserved><font color=#0000ff>except</font></span><span class=hl-default>:

</span><span class=hl-identifier>sys</span><span class=hl-default>.</span><span class=hl-identifier>exit</span><span class=hl-brackets>(</span><span class=hl-number><font color=#800000>1</font></span><span class=hl-brackets>)

</span><span class=hl-reserved><font color=#0000ff>class </font></span><span class=hl-identifier>pyWine</span><span class=hl-default>:

</span><font color=#008000><span class=hl-quotes>"""</span><span class=hl-string>This is the PyWine application</span></font><span class=hl-quotes><font color=#008000>"""

</font></span><span class=hl-reserved><font color=#0000ff>def </font></span><span class=hl-identifier>__init__</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-brackets>)</span><span class=hl-default>:

</span><span class=hl-comment><font color=#ff0000>#Set the Glade file

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>gladefile</span><span class=hl-default> = </span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>pywine.glade</span></font><span class=hl-quotes><font color=#008000>"

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wTree</span><span class=hl-default> = </span><span class=hl-identifier>gtk</span><span class=hl-default>.</span><span class=hl-identifier>glade</span><span class=hl-default>.</span><span class=hl-identifier>XML</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>gladefile</span><span class=hl-code>, </span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>mainWindow</span><span class=hl-quotes>"</span></font><span class=hl-brackets>)

</span><span class=hl-comment><font color=#ff0000>#Create our dictionay and connect it

</font></span><span class=hl-identifier>dic</span><span class=hl-default> = {</span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>on_mainWindow_destroy</span><span class=hl-quotes>"</span></font><span class=hl-default> : </span><span class=hl-identifier>gtk</span><span class=hl-default>.</span><span class=hl-identifier>main_quit</span><span class=hl-default>

, </span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>on_AddWine</span><span class=hl-quotes>"</span></font><span class=hl-default> : </span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>OnAddWine</span><span class=hl-default>}

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wTree</span><span class=hl-default>.</span><span class=hl-identifier>signal_autoconnect</span><span class=hl-brackets>(</span><span class=hl-identifier>dic</span><span class=hl-brackets>)

</span><span class=hl-reserved><font color=#0000ff>def </font></span><span class=hl-identifier>OnAddWine</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>, </span><span class=hl-identifier>widget</span><span class=hl-brackets>)</span><span class=hl-default>:

</span><font color=#008000><span class=hl-quotes>"""</span><span class=hl-string>Called when the use wants to add a wine</span></font><span class=hl-quotes><font color=#008000>"""

</font></span><span class=hl-reserved><font color=#0000ff>print </font></span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>OnAddWine</span></font><span class=hl-quotes><font color=#008000>"

</font></span><span class=hl-reserved><font color=#0000ff>if </font></span><span class=hl-identifier>__name__</span><span class=hl-default> == </span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>__main__</span><span class=hl-quotes>"</span></font><span class=hl-default>:

</span><span class=hl-identifier>wine</span><span class=hl-default> = </span><span class=hl-identifier>pyWine</span><span class=hl-brackets>()

</span><span class=hl-identifier>gtk</span><span class=hl-default>.</span><span class=hl-identifier>main</span><span class=hl-brackets>()</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div align=left>&nbsp;&nbsp;在这里多了一点额外的东西. 一个是on_AddWine信号的处理器. 如果你运行这个程序你会注意到当你点击Add Wine按钮或是从菜单栏中选择Add | Wine时会打印出”OnAddWine”. 代码中的新加的另外一个是我们把主窗口的名字传给gtk.glade.XML, 这会让我们只加载这个窗口和它的子窗口.<br />&nbsp;&nbsp; 下一步是创建一个用来存储酒信息的类:</div>
<div align=left>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
<tbody>
<tr>
<td>
<pre><span class=hl-reserved><font color=#0000ff>class </font></span><span class=hl-identifier>Wine</span><span class=hl-default>:

</span><font color=#008000><span class=hl-quotes>"""</span><span class=hl-string>This class represents all the wine information</span></font><span class=hl-quotes><font color=#008000>"""

</font></span><span class=hl-reserved><font color=#0000ff>def </font></span><span class=hl-identifier>__init__</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>, </span><span class=hl-identifier>wine</span><span class=hl-code>=</span><span class=hl-quotes><font color=#008000>""</font></span><span class=hl-code>, </span><span class=hl-identifier>winery</span><span class=hl-code>=</span><span class=hl-quotes><font color=#008000>""</font></span><span class=hl-code>, </span><span class=hl-identifier>grape</span><span class=hl-code>=</span><span class=hl-quotes><font color=#008000>""</font></span><span class=hl-code>, </span><span class=hl-identifier>year</span><span class=hl-code>=</span><span class=hl-quotes><font color=#008000>""</font></span><span class=hl-brackets>)</span><span class=hl-default>:

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wine</span><span class=hl-default> = </span><span class=hl-identifier>wine

self</span><span class=hl-default>.</span><span class=hl-identifier>winery</span><span class=hl-default> = </span><span class=hl-identifier>winery

self</span><span class=hl-default>.</span><span class=hl-identifier>grape</span><span class=hl-default> = </span><span class=hl-identifier>grape

self</span><span class=hl-default>.</span><span class=hl-identifier>year</span><span class=hl-default> = </span><span class=hl-identifier>year</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div align=left>&nbsp;&nbsp; 很简单, 下一步我们需要创建一个给wineDlg使用的类, 我们称它为wineDialog:&nbsp;</div>
<div align=left>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
<tbody>
<tr>
<td>
<pre><span class=hl-reserved><font color=#0000ff>class </font></span><span class=hl-identifier>wineDialog</span><span class=hl-default>:

</span><font color=#008000><span class=hl-quotes>"""</span><span class=hl-string>This class is used to show wineDlg</span></font><span class=hl-quotes><font color=#008000>"""

</font></span><span class=hl-reserved><font color=#0000ff>def </font></span><span class=hl-identifier>__init__</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>, </span><span class=hl-identifier>wine</span><span class=hl-code>=</span><span class=hl-quotes><font color=#008000>""</font></span><span class=hl-code>, </span><span class=hl-identifier>winery</span><span class=hl-code>=</span><span class=hl-quotes><font color=#008000>""</font></span><span class=hl-code>, </span><span class=hl-identifier>grape</span><span class=hl-code>=</span><span class=hl-quotes><font color=#008000>""</font></span><span class=hl-code>, </span><span class=hl-identifier>year</span><span class=hl-code>=</span><span class=hl-quotes><font color=#008000>""</font></span><span class=hl-brackets>)</span><span class=hl-default>:

</span><span class=hl-comment><font color=#ff0000>#setup the glade file

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>gladefile</span><span class=hl-default> = </span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>pywine.glade</span></font><span class=hl-quotes><font color=#008000>"

</font></span><span class=hl-comment><font color=#ff0000>#setup the wine that we will return

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wine</span><span class=hl-default> = </span><span class=hl-identifier>Wine</span><span class=hl-brackets>(</span><span class=hl-identifier>wine</span><span class=hl-code>,</span><span class=hl-identifier>winery</span><span class=hl-code>,</span><span class=hl-identifier>grape</span><span class=hl-code>,</span><span class=hl-identifier>year</span><span class=hl-brackets>)</span></pre>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p></div>
<div align=left>&nbsp;&nbsp; 下一步我们需要为wineDialog添加一个函数, 它来从glade文件中装载wineDialg物件并显示. 我们还想要返回这个对话框的执行结果, 这会是一个gtk_RESPONSE, 你可以从<a href="http://www.pygtk.org/pygtk2reference/gtk-constants.html#gtk-response-type-constants" target=_blank>PyGTK的网站上</a>得到更多的信息.<br />&nbsp;&nbsp; 这个就是run 函数:</div>
<div align=left>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
<tbody>
<tr>
<td>
<pre><span class=hl-reserved><font color=#0000ff>def </font></span><span class=hl-identifier>run</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-brackets>)</span><span class=hl-default>:

</span><font color=#008000><span class=hl-quotes>"""</span><span class=hl-string>This function will show the wineDlg</span></font><span class=hl-quotes><font color=#008000>"""

</font></span><span class=hl-comment><font color=#ff0000>#load the dialog from the glade file

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wTree</span><span class=hl-default> = </span><span class=hl-identifier>gtk</span><span class=hl-default>.</span><span class=hl-identifier>glade</span><span class=hl-default>.</span><span class=hl-identifier>XML</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>gladefile</span><span class=hl-code>, </span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>wineDlg</span><span class=hl-quotes>"</span></font><span class=hl-brackets>)

</span><span class=hl-comment><font color=#ff0000>#Get the actual dialog widget

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>dlg</span><span class=hl-default> = </span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wTree</span><span class=hl-default>.</span><span class=hl-identifier>get_widget</span><span class=hl-brackets>(</span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>wineDlg</span><span class=hl-quotes>"</span></font><span class=hl-brackets>)

</span><span class=hl-comment><font color=#ff0000>#Get all of the Entry Widgets and set their text

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>enWine</span><span class=hl-default> = </span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wTree</span><span class=hl-default>.</span><span class=hl-identifier>get_widget</span><span class=hl-brackets>(</span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>enWine</span><span class=hl-quotes>"</span></font><span class=hl-brackets>)

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>enWine</span><span class=hl-default>.</span><span class=hl-identifier>set_text</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>wine</span><span class=hl-code>.</span><span class=hl-identifier>wine</span><span class=hl-brackets>)

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>enWinery</span><span class=hl-default> = </span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wTree</span><span class=hl-default>.</span><span class=hl-identifier>get_widget</span><span class=hl-brackets>(</span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>enWinery</span><span class=hl-quotes>"</span></font><span class=hl-brackets>)

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>enWinery</span><span class=hl-default>.</span><span class=hl-identifier>set_text</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>wine</span><span class=hl-code>.</span><span class=hl-identifier>winery</span><span class=hl-brackets>)

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>enGrape</span><span class=hl-default> = </span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wTree</span><span class=hl-default>.</span><span class=hl-identifier>get_widget</span><span class=hl-brackets>(</span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>enGrape</span><span class=hl-quotes>"</span></font><span class=hl-brackets>)

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>enGrape</span><span class=hl-default>.</span><span class=hl-identifier>set_text</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>wine</span><span class=hl-code>.</span><span class=hl-identifier>grape</span><span class=hl-brackets>)

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>enYear</span><span class=hl-default> = </span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wTree</span><span class=hl-default>.</span><span class=hl-identifier>get_widget</span><span class=hl-brackets>(</span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>enYear</span><span class=hl-quotes>"</span></font><span class=hl-brackets>)

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>enYear</span><span class=hl-default>.</span><span class=hl-identifier>set_text</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>wine</span><span class=hl-code>.</span><span class=hl-identifier>year</span><span class=hl-brackets>)

</span><span class=hl-comment><font color=#ff0000>#run the dialog and store the response

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>result</span><span class=hl-default> = </span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>dlg</span><span class=hl-default>.</span><span class=hl-identifier>run</span><span class=hl-brackets>()

</span><span class=hl-comment><font color=#ff0000>#get the value of the entry fields

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wine</span><span class=hl-default>.</span><span class=hl-identifier>wine</span><span class=hl-default> = </span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>enWine</span><span class=hl-default>.</span><span class=hl-identifier>get_text</span><span class=hl-brackets>()

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wine</span><span class=hl-default>.</span><span class=hl-identifier>winery</span><span class=hl-default> = </span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>enWinery</span><span class=hl-default>.</span><span class=hl-identifier>get_text</span><span class=hl-brackets>()

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wine</span><span class=hl-default>.</span><span class=hl-identifier>grape</span><span class=hl-default> = </span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>enGrape</span><span class=hl-default>.</span><span class=hl-identifier>get_text</span><span class=hl-brackets>()

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wine</span><span class=hl-default>.</span><span class=hl-identifier>year</span><span class=hl-default> = </span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>enYear</span><span class=hl-default>.</span><span class=hl-identifier>get_text</span><span class=hl-brackets>()

</span><span class=hl-comment><font color=#ff0000>#we are done with the dialog, destroy it

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>dlg</span><span class=hl-default>.</span><span class=hl-identifier>destroy</span><span class=hl-brackets>()

</span><span class=hl-comment><font color=#ff0000>#return the result and the wine

</font></span><span class=hl-reserved><font color=#0000ff>return </font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>result</span><span class=hl-default>,</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wine</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div align=left>&nbsp;&nbsp; 你会注意到我们装载对话框的方法用的是和装载主窗口一样的方法. 我们调用gtk_glade_XML()并把我们想要装载物件的名称传给它. 这将会自动的显示这个对话框(和装载主窗口的行为相同), 但这样不够好, 我们想让run函数等待用户退出了这个对话框才返回. 要这么做我们需要从物件树里得到这个这个对话框物件(self.dlg = self.wTree.get_widget(“wineDlg”)),然后调用<a href="http://www.pygtk.org/pygtk2reference/class-gtkdialog.html#method-gtkdialog--run" target=_blank>GTKDialogs 的run函数</a>. 下面是PyGTK文档对这个函数的描述:</div>
<div align=left>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
<tbody>
<tr>
<td>
<blockquote>
<p>&nbsp;Run()方法会在一个无穷的主循环里阻塞到它收到一个”response”信号或是销毁. 如果这个对话框是被销毁了, run ()方法会返回一个gtk_RESPONSE_NONE; 否则它返回一个在response信号中的响应id. 在进入这个无穷的主循环之前run ()方法会为你调用对话框的gtk_Widget_show()函数. 注意你仍然需要自己负责显示对话框的子窗口.<br />&nbsp;&nbsp; 在run()方法运行期间, delete事件的默认行为是被禁止的, 如果对话框收到一个delete的事件, 它并不会像窗口通常那样进行销毁, 这时run()方法会返回一个gtk_RESPONSE_DELETE_EVENT. 而且在run ()方法运行的时候对话框是模态的. 你可以通过调用responese()函数产生一个response信号来强制run ()方法在任何时候退出. 在run()方法运行的时候销毁对话框是很糟糕的主意, 因为你后面的代码无法知道对话框是不是已经销毁了.<br />&nbsp;&nbsp; 在run()方法返回后, 你需要负责对话框的隐藏和销毁.</p>
</blockquote>
</td>
</tr>
</tbody>
</table>
</div>
<div align=left>&nbsp;&nbsp;&nbsp; Ok按钮会返回gtk_RESPONSE_OK, Cancel按钮会返回gtk_RESPONSE_CANCEL, 大部分情况下我们仅关心对话框返回的wine信息是不是由用户点Ok按钮产生的.<br />&nbsp;&nbsp; 你还可以看到我们从对话框里得到GTKEntry物件来取/设置它们的文字. 总得来说这个函数还是相当简单的.</div>
<h4 align=left>树状视图和列表存储(List Stores)</h4>
<div align=left>&nbsp;&nbsp;&nbsp;现在我们有了用户想要往列表中添加的酒, 我们需要把它添加进<a href="http://www.pygtk.org/pygtk2reference/class-gtktreeview.html" target=_blank>gtk_TreeView</a>中.<br />&nbsp;&nbsp; GTKTreeViews的主要特性就是它们按照模型指定的任何方式来显示它们的数据. 数据模型可以用<a href="http://www.pygtk.org/pygtk2reference/class-gtkliststore.html" target=_blank>gtk_ListStore</a>, <a href="http://www.pygtk.org/pygtk2reference/class-gtktreestore.html" target=_blank>gtk_TreeStore</a>, <a href="http://www.pygtk.org/pygtk2reference/class-gtktreemodelsort.html" target=_blank>gtk_TreeModelSort</a>,或是<a href="http://www.pygtk.org/pygtk2reference/class-pygtkgenerictreemodel.html" target=_blank>gtk_GenericTreeModel</a>. 在本例子中我们将使用 gkt_ListStore.<br />树状视图与模型的关系有些复杂,但是一旦你可以使用它你就会理解为什么它们是这样的. 很简单的讲模型表现数据,而树状视图则是一个简单的显示数据的方法. 所以对于同一份数据(模型)你可以有多个完全不同的视图. 下面是<a href="http://developer.gnome.org/doc/API/2.0/gtk/TreeWidget.html" target=_blank>GTK+参考手册</a>中的内容:</div>
<div align=left>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 96.95%; BORDER-BOTTOM: #999 1px solid; HEIGHT: 136px" align=center>
<tbody>
<tr>
<td>
<p>&nbsp; 在GTK+中要创建一个树或列表可以使用结合使用GtkTreeModel接口和GtkTreeView物件. 这个物件使用模型/视图/控制器模式设计, 它由以下四个主要部分组成:</p>
<p>树状视图物件(GtkTreeView)<br />列视图 (GtkTreeViewcolumn)<br />单元渲染器(GtkCellRenderer等等)<br />模型接口(GtkTreeModel)</p>
<p>&nbsp; 视图是由前面的三组对象组成, 最后一个是模型. MVC设计模式的一个主要收益是可以使用单个模型创建多个视图. 例如:由文件系统映射的模型(可能由一个文件管理器创建), 可以创建多种视图来显示文件系统的各个部分, 但仅需要在内存中保存一份拷贝</p>
</td>
</tr>
</tbody>
</table>
</div>
<div align=left>&nbsp;&nbsp; 我们要做的第一件是在自动把词典和物件树连接上后往pyWine类的__init__函数中添加一些代码:</p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
<tbody>
<tr>
<td>
<pre><span class=hl-comment><font color=#ff0000>#Here are some variables that can be reused later

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>cWine</span><span class=hl-default> = </span><span class=hl-number><font color=#800000>0

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>cWinery</span><span class=hl-default> = </span><span class=hl-number><font color=#800000>1

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>cGrape</span><span class=hl-default> = </span><span class=hl-number><font color=#800000>2

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>cYear</span><span class=hl-default> = </span><span class=hl-number><font color=#800000>3

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>sWine</span><span class=hl-default> = </span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>Wine</span></font><span class=hl-quotes><font color=#008000>"

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>sWinery</span><span class=hl-default> = </span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>Winery</span></font><span class=hl-quotes><font color=#008000>"

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>sGrape</span><span class=hl-default> = </span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>Grape</span></font><span class=hl-quotes><font color=#008000>"

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>sYear</span><span class=hl-default> = </span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>Year</span></font><span class=hl-quotes><font color=#008000>"

</font></span><span class=hl-comment><font color=#ff0000>#Get the treeView from the widget Tree

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wineView</span><span class=hl-default> = </span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wTree</span><span class=hl-default>.</span><span class=hl-identifier>get_widget</span><span class=hl-brackets>(</span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>wineView</span><span class=hl-quotes>"</span></font><span class=hl-brackets>)

</span><span class=hl-comment><font color=#ff0000>#Add all of the List Columns to the wineView

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>AddWineListColumn</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>sWine</span><span class=hl-code>, </span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>cWine</span><span class=hl-brackets>)

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>AddWineListColumn</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>sWinery</span><span class=hl-code>, </span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>cWinery</span><span class=hl-brackets>)

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>AddWineListColumn</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>sGrape</span><span class=hl-code>, </span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>cGrape</span><span class=hl-brackets>)

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>AddWineListColumn</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>sYear</span><span class=hl-code>, </span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>cYear</span><span class=hl-brackets>)</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div align=left>&nbsp;&nbsp;&nbsp; 这个代码是相当直观的, 首先我们创建一些类似定义的变量(这样我们在后面就可以很轻松的改变它们)然后我们从物件树中得到gtk_TreeView. 在这之后我们通过调用一个新的函数来往列表中添加我们需要的列. AddWineListColumn是一个很快的小函数,但它能防止我们每次重复写创建列的代码.</div>
<div align=left>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
<tbody>
<tr>
<td>def AddWineListColumn(self, title, columnId):<br />“”&#8221;This function adds a column to the list view.<br />First it create the gtk.TreeViewColumn and then set<br />some needed properties”&#8221;”</p>
<p>column = gtk.TreeViewColumn(title, gtk.CellRendererText()<br />, text=columnId)<br />column.set_resizable(True)<br />column.set_sort_column_id(columnId)<br />self.wineView.append_column(column)</p>
</td>
</tr>
</tbody>
</table>
</div>
<div align=left>&nbsp; 这个代码有一点点复杂, 首先我们创建一个使用<a href="http://www.pygtk.org/pygtk2reference/class-gtkcellrenderertext.html" target=_blank>gtk_CellRendererText</a>作为它的<a href="http://www.pygtk.org/pygtk2reference/class-gtkcellrenderer.html" target=_blank>gtk_CellRenderer</a>的新<a href="http://www.pygtk.org/pygtk2reference/class-gtktreeviewcolumn.html" target=_blank>gtk_TreeViewColumn</a>. 这里是一些从<a href="http://developer.gnome.org/doc/API/2.0/gtk/TreeWidget.html" target=_blank>GTK+参考手册</a>里的较全的信息:</div>
<div align=left>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
<tbody>
<tr>
<td>&nbsp;&nbsp; 一旦GtkTreeView物件有了一个模型, 它需要知道如何显示这个模型. 它通过列和单元渲染器来完成这项工作.<br />单元渲染器是用来使用某种方法在树状模型中绘图这些数据. 在GTK+2.x中有很多单元渲染器, 包括: GtkCellRenderText, GtkCellRendererPixbuf 和GtkCellRendererToggle. 写一个自定义的渲染器也相对简单.<br />&nbsp;&nbsp; GtkTreeView使用GtkTreeViewColumn对象来组织在树状视图中纵的列. 它需要知道列的名字用来以标签的形式显示给用户, 使用单元渲染器的类型和对于一个给定的行它需要得到的数据块.</td>
</tr>
</tbody>
</table>
</div>
<div align=left>&nbsp; &nbsp;因此简单的讲我们在创建一个包含特定标题的列, 并指明它将会使用gtk_CellRendererText(来显示简单的文字),然后再告诉它它与模型中的哪一项关联在一起.然后我们把它设置成可以改变大小而且用户可以通过点击列的头来对它进行排序. 在这之后我们把这一列加到视图中.<br />&nbsp;&nbsp; 好了, 我们完成了模型的创建. 我们要再回到pyWine类的__init__函数里继续:</div>
<div align=left>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
<tbody>
<tr>
<td>
<pre>#Create the listStore Model to use with the wineView

self.wineList = gtk.ListStore(str, str, str, str)

#Attatch the model to the treeView

self.wineView.set_model(self.wineList)</pre>
</td>
</tr>
</tbody>
</table>
</div>
<div align=left>&nbsp;&nbsp; 大体上我们仅仅创建了一个gtk_ListStore并告诉它它有四个子项, 并且它们都是字符串. 然后我们把这个模型与视图绑定起来, 这就是所有我们需要为初始化gtk_TreeView做的.</div>
<h4 align=left>把所有合并到一起&nbsp;&nbsp;</h4>
<p align=left>&nbsp;我们要做的最后一件事是完成pyWine类中的OnAddWine函数(从菜单或工具栏按钮调用). 这个函数很简单:</p>
<p align=left>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
<tbody>
<tr>
<td><span class=hl-identifier>OnAddWine</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>, </span><span class=hl-identifier>widget</span><span class=hl-brackets>)</span><span class=hl-default>:<br /></span><font color=#008000><span class=hl-quotes>&#8220;&#8221;"</span><span class=hl-string>Called when the use wants to add a wine</span></font><span class=hl-quotes><font color=#008000>&#8220;&#8221;"<br /></font></span><span class=hl-comment><font color=#ff0000>#Create the dialog, show it, and store the results<br /></font></span><span class=hl-identifier>wineDlg</span><span class=hl-default> = </span><span class=hl-identifier>wineDialog</span><span class=hl-brackets>()</span><span class=hl-default>; <br /></span><span class=hl-identifier>result</span><span class=hl-default>,</span><span class=hl-identifier>newWine</span><span class=hl-default> = </span><span class=hl-identifier>wineDlg</span><span class=hl-default>.</span><span class=hl-identifier>run</span><span class=hl-brackets>()</p>
<p></span><span class=hl-identifier>if </span><span class=hl-brackets>(</span><span class=hl-identifier>result</span><span class=hl-code> == </span><span class=hl-identifier>gtk</span><span class=hl-code>.</span><span class=hl-identifier>RESPONSE_OK</span><span class=hl-brackets>)</span><span class=hl-default>:<br /></span><span class=hl-quotes><font color=#008000>&#8220;&#8221;"</font></span><span class=hl-string><font color=#008000>The user clicked Ok, so let&#8217;s add this<br />wine to the wine list</font></span><span class=hl-quotes><font color=#008000>&#8220;&#8221;"<br /></font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wineList</span><span class=hl-default>.</span><span class=hl-identifier>append</span><span class=hl-brackets>(</span><span class=hl-identifier>newWine</span><span class=hl-code>.</span><span class=hl-identifier>getList</span><span class=hl-brackets>())</span></td>
</tr>
</tbody>
</table>
<p align=left>&nbsp;&nbsp; 这里我们创建了一个wineDialog的实例, 然后运行它并把用户输入的酒的信息保存.然后我们检查result是不是gtk_RESPONSE_OK(用户点击了Ok按钮), 如果是我们就把酒的信息添加到gtk_ListStore中, 它会自动的在gtk_TreeView中显示出来因此它们是连接在一起的.<br />&nbsp;&nbsp; 在wine类中我使用简单的getList函数以使阅读代码变得简单一些:</p>
<p align=left>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
<tbody>
<tr>
<td>
<pre><span class=hl-reserved><font color=#0000ff>def </font></span><span class=hl-identifier>getList</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-brackets>)</span><span class=hl-default>:

</span><span class=hl-quotes><font color=#008000>"""</font></span><span class=hl-string><font color=#008000>This function returns a list made up of the

wine information.  It is used to add a wine to the

wineList easily</font></span><span class=hl-quotes><font color=#008000>"""

</font></span><span class=hl-reserved><font color=#0000ff>return </font></span><span class=hl-brackets>[</span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>wine</span><span class=hl-code>, </span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>winery</span><span class=hl-code>, </span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>grape</span><span class=hl-code>, </span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>year</span><span class=hl-brackets>]</span></pre>
</td>
</tr>
</tbody>
</table>
<p align=center><img src="http://www.cublog.cn/u/5462/upfile/060819170534.png" onload="javascript:if(this.width>500)this.width=500;&#8221; border=0></p>
<p align=left>&nbsp;&nbsp; 到这里这个简单程序就算完成了, 尽管它不保存任何信息或是任何和它类似的信息, 但是它确实描述了一些创建一个完整pyGTK 应用程序的基本步骤.<br />&nbsp;&nbsp;完整的代码和Glade文件可以在<a href="http://www.cublog.cn/u/5462/upfile/060819164119.tar" target=_blank>这里</a>下载,你也可心浏览下面的完整程序:</p>
<p align=left>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
<tbody>
<tr>
<td>
<pre><span class=hl-comment><font color=#ff0000>#!/usr/bin/env python

</font></span><span class=hl-reserved><font color=#0000ff>import </font></span><span class=hl-identifier>sys

</span><span class=hl-reserved><font color=#0000ff>try</font></span><span class=hl-default>:

 </span><span class=hl-reserved><font color=#0000ff>import </font></span><span class=hl-identifier>pygtk

  pygtk</span><span class=hl-default>.</span><span class=hl-identifier>require</span><span class=hl-brackets>(</span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>2.0</span><span class=hl-quotes>"</span></font><span class=hl-brackets>)

</span><span class=hl-reserved><font color=#0000ff>except</font></span><span class=hl-default>:

  </span><span class=hl-reserved><font color=#0000ff>pass

try</font></span><span class=hl-default>:

</span><span class=hl-reserved><font color=#0000ff>import </font></span><span class=hl-identifier>gtk

  </span><span class=hl-reserved><font color=#0000ff>import </font></span><span class=hl-identifier>gtk</span><span class=hl-default>.</span><span class=hl-identifier>glade

</span><span class=hl-reserved><font color=#0000ff>except</font></span><span class=hl-default>:

</span><span class=hl-identifier>sys</span><span class=hl-default>.</span><span class=hl-identifier>exit</span><span class=hl-brackets>(</span><span class=hl-number><font color=#800000>1</font></span><span class=hl-brackets>)

</span><span class=hl-reserved><font color=#0000ff>class </font></span><span class=hl-identifier>pyWine</span><span class=hl-default>:

</span><font color=#008000><span class=hl-quotes>"""</span><span class=hl-string>This is an Hello World GTK application</span></font><span class=hl-quotes><font color=#008000>"""

</font></span><span class=hl-reserved><font color=#0000ff>def </font></span><span class=hl-identifier>__init__</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-brackets>)</span><span class=hl-default>:

</span><span class=hl-comment><font color=#ff0000>#Set the Glade file

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>gladefile</span><span class=hl-default> = </span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>pywine.glade</span></font><span class=hl-quotes><font color=#008000>"

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wTree</span><span class=hl-default> = </span><span class=hl-identifier>gtk</span><span class=hl-default>.</span><span class=hl-identifier>glade</span><span class=hl-default>.</span><span class=hl-identifier>XML</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>gladefile</span><span class=hl-code>, </span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>mainWindow</span><span class=hl-quotes>"</span></font><span class=hl-brackets>)

</span><span class=hl-comment><font color=#ff0000>#Create our dictionay and connect it

</font></span><span class=hl-identifier>dic</span><span class=hl-default> = {</span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>on_mainWindow_destroy</span><span class=hl-quotes>"</span></font><span class=hl-default> : </span><span class=hl-identifier>gtk</span><span class=hl-default>.</span><span class=hl-identifier>main_quit</span><span class=hl-default>

, </span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>on_AddWine</span><span class=hl-quotes>"</span></font><span class=hl-default> : </span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>OnAddWine</span><span class=hl-default>}

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wTree</span><span class=hl-default>.</span><span class=hl-identifier>signal_autoconnect</span><span class=hl-brackets>(</span><span class=hl-identifier>dic</span><span class=hl-brackets>)

</span><span class=hl-comment><font color=#ff0000>#Here are some variables that can be reused later

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>cWine</span><span class=hl-default> = </span><span class=hl-number><font color=#800000>0

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>cWinery</span><span class=hl-default> = </span><span class=hl-number><font color=#800000>1

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>cGrape</span><span class=hl-default> = </span><span class=hl-number><font color=#800000>2

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>cYear</span><span class=hl-default> = </span><span class=hl-number><font color=#800000>3

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>sWine</span><span class=hl-default> = </span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>Wine</span></font><span class=hl-quotes><font color=#008000>"

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>sWinery</span><span class=hl-default> = </span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>Winery</span></font><span class=hl-quotes><font color=#008000>"

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>sGrape</span><span class=hl-default> = </span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>Grape</span></font><span class=hl-quotes><font color=#008000>"

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>sYear</span><span class=hl-default> = </span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>Year</span></font><span class=hl-quotes><font color=#008000>"

</font></span><span class=hl-comment><font color=#ff0000>#Get the treeView from the widget Tree

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wineView</span><span class=hl-default> = </span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wTree</span><span class=hl-default>.</span><span class=hl-identifier>get_widget</span><span class=hl-brackets>(</span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>wineView</span><span class=hl-quotes>"</span></font><span class=hl-brackets>)

</span><span class=hl-comment><font color=#ff0000>#Add all of the List Columns to the wineView

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>AddWineListColumn</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>sWine</span><span class=hl-code>, </span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>cWine</span><span class=hl-brackets>)

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>AddWineListColumn</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>sWinery</span><span class=hl-code>, </span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>cWinery</span><span class=hl-brackets>)

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>AddWineListColumn</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>sGrape</span><span class=hl-code>, </span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>cGrape</span><span class=hl-brackets>)

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>AddWineListColumn</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>sYear</span><span class=hl-code>, </span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>cYear</span><span class=hl-brackets>)

</span><span class=hl-comment><font color=#ff0000>#Create the listStore Model to use with the wineView

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wineList</span><span class=hl-default> = </span><span class=hl-identifier>gtk</span><span class=hl-default>.</span><span class=hl-identifier>ListStore</span><span class=hl-brackets>(</span><span class=hl-identifier>str</span><span class=hl-code>, </span><span class=hl-identifier>str</span><span class=hl-code>, </span><span class=hl-identifier>str</span><span class=hl-code>, </span><span class=hl-identifier>str</span><span class=hl-brackets>)

</span><span class=hl-comment><font color=#ff0000>#Attache the model to the treeView

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wineView</span><span class=hl-default>.</span><span class=hl-identifier>set_model</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>wineList</span><span class=hl-brackets>)

</span><span class=hl-reserved><font color=#0000ff>def </font></span><span class=hl-identifier>AddWineListColumn</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>, </span><span class=hl-identifier>title</span><span class=hl-code>, </span><span class=hl-identifier>columnId</span><span class=hl-brackets>)</span><span class=hl-default>:

</span><span class=hl-quotes><font color=#008000>"""</font></span><span class=hl-string><font color=#008000>This function adds a column to the list view.

First it create the gtk.TreeViewColumn and then set

some needed properties</font></span><span class=hl-quotes><font color=#008000>"""

</font></span><span class=hl-identifier>column</span><span class=hl-default> = </span><span class=hl-identifier>gtk</span><span class=hl-default>.</span><span class=hl-identifier>TreeViewColumn</span><span class=hl-brackets>(</span><span class=hl-identifier>title</span><span class=hl-code>, </span><span class=hl-identifier>gtk</span><span class=hl-code>.</span><span class=hl-identifier>CellRendererText</span><span class=hl-brackets>()</span><span class=hl-code>

, </span><span class=hl-identifier>text</span><span class=hl-code>=</span><span class=hl-identifier>columnId</span><span class=hl-brackets>)

</span><span class=hl-identifier>column</span><span class=hl-default>.</span><span class=hl-identifier>set_resizable</span><span class=hl-brackets>(</span><span class=hl-reserved><font color=#0000ff>True</font></span><span class=hl-brackets>)

</span><span class=hl-identifier>column</span><span class=hl-default>.</span><span class=hl-identifier>set_sort_column_id</span><span class=hl-brackets>(</span><span class=hl-identifier>columnId</span><span class=hl-brackets>)

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wineView</span><span class=hl-default>.</span><span class=hl-identifier>append_column</span><span class=hl-brackets>(</span><span class=hl-identifier>column</span><span class=hl-brackets>)

</span><span class=hl-reserved><font color=#0000ff>def </font></span><span class=hl-identifier>OnAddWine</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>, </span><span class=hl-identifier>widget</span><span class=hl-brackets>)</span><span class=hl-default>:

</span><font color=#008000><span class=hl-quotes>"""</span><span class=hl-string>Called when the use wants to add a wine</span></font><span class=hl-quotes><font color=#008000>"""

</font></span><span class=hl-comment><font color=#ff0000>#Cteate the dialog, show it, and store the results

</font></span><span class=hl-identifier>wineDlg</span><span class=hl-default> = </span><span class=hl-identifier>wineDialog</span><span class=hl-brackets>()</span><span class=hl-default>;

</span><span class=hl-identifier>result</span><span class=hl-default>,</span><span class=hl-identifier>newWine</span><span class=hl-default> = </span><span class=hl-identifier>wineDlg</span><span class=hl-default>.</span><span class=hl-identifier>run</span><span class=hl-brackets>()

</span><span class=hl-identifier>if </span><span class=hl-brackets>(</span><span class=hl-identifier>result</span><span class=hl-code> == </span><span class=hl-identifier>gtk</span><span class=hl-code>.</span><span class=hl-identifier>RESPONSE_OK</span><span class=hl-brackets>)</span><span class=hl-default>:

</span><span class=hl-quotes><font color=#008000>"""</font></span><span class=hl-string><font color=#008000>The user clicked Ok, so let's add this

wine to the wine list</font></span><span class=hl-quotes><font color=#008000>"""

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wineList</span><span class=hl-default>.</span><span class=hl-identifier>append</span><span class=hl-brackets>(</span><span class=hl-identifier>newWine</span><span class=hl-code>.</span><span class=hl-identifier>getList</span><span class=hl-brackets>())

</span><span class=hl-reserved><font color=#0000ff>class </font></span><span class=hl-identifier>wineDialog</span><span class=hl-default>:

</span><font color=#008000><span class=hl-quotes>"""</span><span class=hl-string>This class is used to show wineDlg</span></font><span class=hl-quotes><font color=#008000>"""

</font></span><span class=hl-reserved><font color=#0000ff>def </font></span><span class=hl-identifier>__init__</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>, </span><span class=hl-identifier>wine</span><span class=hl-code>=</span><span class=hl-quotes><font color=#008000>""</font></span><span class=hl-code>, </span><span class=hl-identifier>winery</span><span class=hl-code>=</span><span class=hl-quotes><font color=#008000>""</font></span><span class=hl-code>, </span><span class=hl-identifier>grape</span><span class=hl-code>=</span><span class=hl-quotes><font color=#008000>""</font></span><span class=hl-code>, </span><span class=hl-identifier>year</span><span class=hl-code>=</span><span class=hl-quotes><font color=#008000>""</font></span><span class=hl-brackets>)</span><span class=hl-default>:

</span><span class=hl-comment><font color=#ff0000>#setup the glade file

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>gladefile</span><span class=hl-default> = </span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>pywine.glade</span></font><span class=hl-quotes><font color=#008000>"

</font></span><span class=hl-comment><font color=#ff0000>#setup the wine that we will return

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wine</span><span class=hl-default> = </span><span class=hl-identifier>Wine</span><span class=hl-brackets>(</span><span class=hl-identifier>wine</span><span class=hl-code>,</span><span class=hl-identifier>winery</span><span class=hl-code>,</span><span class=hl-identifier>grape</span><span class=hl-code>,</span><span class=hl-identifier>year</span><span class=hl-brackets>)

</span><span class=hl-reserved><font color=#0000ff>def </font></span><span class=hl-identifier>run</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-brackets>)</span><span class=hl-default>:

</span><font color=#008000><span class=hl-quotes>"""</span><span class=hl-string>This function will show the wineDlg</span></font><span class=hl-quotes><font color=#008000>"""

</font></span><span class=hl-comment><font color=#ff0000>#load the dialog from the glade file

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wTree</span><span class=hl-default> = </span><span class=hl-identifier>gtk</span><span class=hl-default>.</span><span class=hl-identifier>glade</span><span class=hl-default>.</span><span class=hl-identifier>XML</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>gladefile</span><span class=hl-code>, </span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>wineDlg</span><span class=hl-quotes>"</span></font><span class=hl-brackets>)

</span><span class=hl-comment><font color=#ff0000>#Get the actual dialog widget

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>dlg</span><span class=hl-default> = </span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wTree</span><span class=hl-default>.</span><span class=hl-identifier>get_widget</span><span class=hl-brackets>(</span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>wineDlg</span><span class=hl-quotes>"</span></font><span class=hl-brackets>)

</span><span class=hl-comment><font color=#ff0000>#Get all of the Entry Widgets and set their text

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>enWine</span><span class=hl-default> = </span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wTree</span><span class=hl-default>.</span><span class=hl-identifier>get_widget</span><span class=hl-brackets>(</span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>enWine</span><span class=hl-quotes>"</span></font><span class=hl-brackets>)

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>enWine</span><span class=hl-default>.</span><span class=hl-identifier>set_text</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>wine</span><span class=hl-code>.</span><span class=hl-identifier>wine</span><span class=hl-brackets>)

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>enWinery</span><span class=hl-default> = </span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wTree</span><span class=hl-default>.</span><span class=hl-identifier>get_widget</span><span class=hl-brackets>(</span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>enWinery</span><span class=hl-quotes>"</span></font><span class=hl-brackets>)

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>enWinery</span><span class=hl-default>.</span><span class=hl-identifier>set_text</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>wine</span><span class=hl-code>.</span><span class=hl-identifier>winery</span><span class=hl-brackets>)

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>enGrape</span><span class=hl-default> = </span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wTree</span><span class=hl-default>.</span><span class=hl-identifier>get_widget</span><span class=hl-brackets>(</span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>enGrape</span><span class=hl-quotes>"</span></font><span class=hl-brackets>)

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>enGrape</span><span class=hl-default>.</span><span class=hl-identifier>set_text</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>wine</span><span class=hl-code>.</span><span class=hl-identifier>grape</span><span class=hl-brackets>)

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>enYear</span><span class=hl-default> = </span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wTree</span><span class=hl-default>.</span><span class=hl-identifier>get_widget</span><span class=hl-brackets>(</span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>enYear</span><span class=hl-quotes>"</span></font><span class=hl-brackets>)

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>enYear</span><span class=hl-default>.</span><span class=hl-identifier>set_text</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>wine</span><span class=hl-code>.</span><span class=hl-identifier>year</span><span class=hl-brackets>)

</span><span class=hl-comment><font color=#ff0000>#run the dialog and store the response

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>result</span><span class=hl-default> = </span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>dlg</span><span class=hl-default>.</span><span class=hl-identifier>run</span><span class=hl-brackets>()

</span><span class=hl-comment><font color=#ff0000>#get the value of the entry fields

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wine</span><span class=hl-default>.</span><span class=hl-identifier>wine</span><span class=hl-default> = </span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>enWine</span><span class=hl-default>.</span><span class=hl-identifier>get_text</span><span class=hl-brackets>()

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wine</span><span class=hl-default>.</span><span class=hl-identifier>winery</span><span class=hl-default> = </span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>enWinery</span><span class=hl-default>.</span><span class=hl-identifier>get_text</span><span class=hl-brackets>()

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wine</span><span class=hl-default>.</span><span class=hl-identifier>grape</span><span class=hl-default> = </span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>enGrape</span><span class=hl-default>.</span><span class=hl-identifier>get_text</span><span class=hl-brackets>()

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wine</span><span class=hl-default>.</span><span class=hl-identifier>year</span><span class=hl-default> = </span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>enYear</span><span class=hl-default>.</span><span class=hl-identifier>get_text</span><span class=hl-brackets>()

</span><span class=hl-comment><font color=#ff0000>#we are done with the dialog, destory it

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>dlg</span><span class=hl-default>.</span><span class=hl-identifier>destroy</span><span class=hl-brackets>()

</span><span class=hl-comment><font color=#ff0000>#return the result and the wine

</font></span><span class=hl-reserved><font color=#0000ff>return </font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>result</span><span class=hl-default>,</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wine

</span><span class=hl-reserved><font color=#0000ff>class </font></span><span class=hl-identifier>Wine</span><span class=hl-default>:

</span><font color=#008000><span class=hl-quotes>"""</span><span class=hl-string>This class represents all the wine information</span></font><span class=hl-quotes><font color=#008000>"""

</font></span><span class=hl-reserved><font color=#0000ff>def </font></span><span class=hl-identifier>__init__</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>, </span><span class=hl-identifier>wine</span><span class=hl-code>=</span><span class=hl-quotes><font color=#008000>""</font></span><span class=hl-code>, </span><span class=hl-identifier>winery</span><span class=hl-code>=</span><span class=hl-quotes><font color=#008000>""</font></span><span class=hl-code>, </span><span class=hl-identifier>grape</span><span class=hl-code>=</span><span class=hl-quotes><font color=#008000>""</font></span><span class=hl-code>, </span><span class=hl-identifier>year</span><span class=hl-code>=</span><span class=hl-quotes><font color=#008000>""</font></span><span class=hl-brackets>)</span><span class=hl-default>:

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wine</span><span class=hl-default> = </span><span class=hl-identifier>wine

self</span><span class=hl-default>.</span><span class=hl-identifier>winery</span><span class=hl-default> = </span><span class=hl-identifier>winery

self</span><span class=hl-default>.</span><span class=hl-identifier>grape</span><span class=hl-default> = </span><span class=hl-identifier>grape

self</span><span class=hl-default>.</span><span class=hl-identifier>year</span><span class=hl-default> = </span><span class=hl-identifier>year

</span><span class=hl-reserved><font color=#0000ff>def </font></span><span class=hl-identifier>getList</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-brackets>)</span><span class=hl-default>:

</span><span class=hl-quotes><font color=#008000>"""</font></span><span class=hl-string><font color=#008000>This function returns a list made up of the

wine information.  It is used to add a wine to the

wineList easily</font></span><span class=hl-quotes><font color=#008000>"""

</font></span><span class=hl-reserved><font color=#0000ff>return </font></span><span class=hl-brackets>[</span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>wine</span><span class=hl-code>, </span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>winery</span><span class=hl-code>, </span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>grape</span><span class=hl-code>, </span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>year</span><span class=hl-brackets>]

</span><span class=hl-reserved><font color=#0000ff>if </font></span><span class=hl-identifier>__name__</span><span class=hl-default> == </span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>__main__</span><span class=hl-quotes>"</span></font><span class=hl-default>:

</span><span class=hl-identifier>wine</span><span class=hl-default> = </span><span class=hl-identifier>pyWine</span><span class=hl-brackets>()

</span><span class=hl-identifier>gtk</span><span class=hl-default>.</span><span class=hl-identifier>main</span><span class=hl-brackets>()</span></pre>
</td>
</tr>
</tbody>
</table>
<p></p>
<div></div>
<div></div>
<div></div>
<div></div>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark to:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fblog.pangwa.com%2F2006%2F08%2F19%2F%25e4%25bd%25bf%25e7%2594%25a8pygtk%25e5%2592%258cglade%25e6%259e%2584%25e5%25bb%25ba%25e5%25ba%2594%25e7%2594%25a8%25e7%25a8%258b%25e5%25ba%258f%2F&amp;title=%E4%BD%BF%E7%94%A8PyGtk%E5%92%8CGlade%E6%9E%84%E5%BB%BA%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.pangwa.com%2F2006%2F08%2F19%2F%25e4%25bd%25bf%25e7%2594%25a8pygtk%25e5%2592%258cglade%25e6%259e%2584%25e5%25bb%25ba%25e5%25ba%2594%25e7%2594%25a8%25e7%25a8%258b%25e5%25ba%258f%2F&amp;title=%E4%BD%BF%E7%94%A8PyGtk%E5%92%8CGlade%E6%9E%84%E5%BB%BA%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fblog.pangwa.com%2F2006%2F08%2F19%2F%25e4%25bd%25bf%25e7%2594%25a8pygtk%25e5%2592%258cglade%25e6%259e%2584%25e5%25bb%25ba%25e5%25ba%2594%25e7%2594%25a8%25e7%25a8%258b%25e5%25ba%258f%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fblog.pangwa.com%2F2006%2F08%2F19%2F%25e4%25bd%25bf%25e7%2594%25a8pygtk%25e5%2592%258cglade%25e6%259e%2584%25e5%25bb%25ba%25e5%25ba%2594%25e7%2594%25a8%25e7%25a8%258b%25e5%25ba%258f%2F&amp;title=%E4%BD%BF%E7%94%A8PyGtk%E5%92%8CGlade%E6%9E%84%E5%BB%BA%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fblog.pangwa.com%2F2006%2F08%2F19%2F%25e4%25bd%25bf%25e7%2594%25a8pygtk%25e5%2592%258cglade%25e6%259e%2584%25e5%25bb%25ba%25e5%25ba%2594%25e7%2594%25a8%25e7%25a8%258b%25e5%25ba%258f%2F&amp;title=%E4%BD%BF%E7%94%A8PyGtk%E5%92%8CGlade%E6%9E%84%E5%BB%BA%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fblog.pangwa.com%2F2006%2F08%2F19%2F%25e4%25bd%25bf%25e7%2594%25a8pygtk%25e5%2592%258cglade%25e6%259e%2584%25e5%25bb%25ba%25e5%25ba%2594%25e7%2594%25a8%25e7%25a8%258b%25e5%25ba%258f%2F&amp;title=%E4%BD%BF%E7%94%A8PyGtk%E5%92%8CGlade%E6%9E%84%E5%BB%BA%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fblog.pangwa.com%2F2006%2F08%2F19%2F%25e4%25bd%25bf%25e7%2594%25a8pygtk%25e5%2592%258cglade%25e6%259e%2584%25e5%25bb%25ba%25e5%25ba%2594%25e7%2594%25a8%25e7%25a8%258b%25e5%25ba%258f%2F&amp;t=%E4%BD%BF%E7%94%A8PyGtk%E5%92%8CGlade%E6%9E%84%E5%BB%BA%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://blog.pangwa.com/2006/08/19/%e4%bd%bf%e7%94%a8pygtk%e5%92%8cglade%e6%9e%84%e5%bb%ba%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用PyGTK和Glade创建用户界面</title>
		<link>http://blog.pangwa.com/2006/08/06/%e4%bd%bf%e7%94%a8pygtk%e5%92%8cglade%e5%88%9b%e5%bb%ba%e7%94%a8%e6%88%b7%e7%95%8c%e9%9d%a2/</link>
		<comments>http://blog.pangwa.com/2006/08/06/%e4%bd%bf%e7%94%a8pygtk%e5%92%8cglade%e5%88%9b%e5%bb%ba%e7%94%a8%e6%88%b7%e7%95%8c%e9%9d%a2/#comments</comments>
		<pubDate>Sun, 06 Aug 2006 16:21:00 +0000</pubDate>
		<dc:creator>pangwa</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://blog.pangwa.com/?p=135</guid>
		<description><![CDATA[&#160;&#160; 原文:&#160;(奇怪, 我把类型选为翻译, 咋看上去啥也没有哪!!) &#160;&#160; 在花了一些时间使用Tkinter创建用户界面后发现它很简单, 但是在如何把界面和程序代码连接起来上费了些周折. 我决定试一试使用另外的工具包来创建界面. 经过一段时间的搜寻后我决定使用PyGTK和Glade. &#160; 使我下决心使用这两个技术的原因是:一. 它们是跨平台的 二. Glade能够我把代码和界面分离开来的愿望. &#160; 如果你之前从没听说过Glade, 它就是一个在GTK+和GNOME下的用户界面生成器. 它生成描述用户界面的xml文件. &#160;&#160; pyGTK的网站上这样描述PyGTK: PyGTK为GTK+库提供了一个在Python程序中便于使用的封装, 它用来负责一些繁杂的细节诸如:管理内存和类型转换. 当把它与PyORBit和gnome-python结合起来时,它可以用来写具有完备功能的Gnome应用程序. &#160; 现在我们从这里开始. 我正在我刚安装的Debian系统上写这些. 如果你也使用Debian或是一个基于Debian的发行版, 那么取得PyGTK和Glade就很简单: apt-get install python-gtk2 python-glade2 &#160; &#160;&#160; 现在让我们创建我们第一个简单的界面, 这是你第一次启动Glade时的界面:&#160; &#160; 我们需要做的就是按下Glade面板的上的”Window” 按钮来创建主窗口. 然后就可以编辑这个窗口的属性了: &#160; &#160;&#160; 我们把这个窗口命名为MainWindow, 然后再把它的标题设置成”Hello World!”&#160;&#160; 如果你已经习惯使用集成的界面设计工具像VisualStudio, 可能在最初使用Glade的时候会有些感到奇怪. 特别是当你实际上并不是把控件放到你想放到屏幕上的一些地方而是把它们”打包”. 但更奇怪的是(至少是对我来讲)大多数界面设计工具都是这样做的,而另外的一些程序像Visual studio实际上才是奇怪的.&#160;&#160; 无论如何我们回到向导上来, 接下来要做的事是添加一个标签来告诉用户去点击按钮(当然我们可以把文字放到按钮上,但是只有一个控件有多少乐趣啊?!). 由于GTK使用容器来打包器件, 我们要做的第一件事就是添加一个容器. 因为我们要把标签放到按钮上,所以使用了一个有两行的纵向盒子(Vertical [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;&nbsp; <a href="http://www.learningpython.com/2006/05/07/creating-a-gui-using-pygtk-and-glade/" target=_blank>原文:</a>&nbsp;(奇怪, 我把类型选为翻译, 咋看上去啥也没有哪!!)</p>
<p>&nbsp;&nbsp; 在花了一些时间使用Tkinter创建用户界面后发现它很简单, 但是在如何把界面和程序代码连接起来上费了些周折. 我决定试一试使用另外的工具包来创建界面. 经过一段时间的搜寻后我决定使用PyGTK和Glade.</p>
<p>&nbsp; 使我下决心使用这两个技术的原因是:一. 它们是跨平台的 二. Glade能够我把代码和界面分离开来的愿望.</p>
<p>&nbsp; 如果你之前从没听说过Glade, 它就是一个在GTK+和GNOME下的用户界面生成器. 它生成描述用户界面的xml文件.</p>
<p>&nbsp;&nbsp; pyGTK的网站上这样描述PyGTK:</p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
<tbody>
<tr>
<td><em>PyGTK为GTK+库提供了一个在Python程序中便于使用的封装, 它用来负责一些繁杂的细节诸如:管理内存和类型转换. 当把它与PyORBit和gnome-python结合起来时,它可以用来写具有完备功能的Gnome应用程序.</em></td>
</tr>
</tbody>
</table>
<p>&nbsp; 现在我们从这里开始. 我正在我刚安装的Debian系统上写这些. 如果你也使用Debian或是一个基于Debian的发行版, 那么取得PyGTK和Glade就很简单:</p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
<tbody>
<tr>
<td>apt-get install python-gtk2 python-glade2</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>&nbsp;&nbsp; 现在让我们创建我们第一个简单的界面, 这是你第一次启动Glade时的界面:&nbsp;</p>
<table cellSpacing=1 cellPadding=1 width=400 border=0>
<tbody>
<tr>
<td>&nbsp;</p>
<p align=center><img style="WIDTH: 536px; HEIGHT: 416px" height=507 src="http://www.cublog.cn/u/5462/photo/060804200723.png" width=536></p>
</td>
</tr>
</tbody>
</table>
<p>我们需要做的就是按下Glade面板的上的”Window” 按钮来创建主窗口. 然后就可以编辑这个窗口的属性了:</p>
<table cellSpacing=1 cellPadding=1 width=400 border=0>
<tbody>
<tr>
<td>&nbsp;<img style="WIDTH: 540px; HEIGHT: 342px" height=462 src="http://www.cublog.cn/u/5462/photo/060804200755.png" width=476></td>
</tr>
</tbody>
</table>
<p>&nbsp;&nbsp; 我们把这个窗口命名为MainWindow, 然后再把它的标题设置成”Hello World!”<br />&nbsp;&nbsp; 如果你已经习惯使用集成的界面设计工具像VisualStudio, 可能在最初使用Glade的时候会有些感到奇怪. 特别是当你实际上并不是把控件放到你想放到屏幕上的一些地方而是把它们”打包”. 但更奇怪的是(至少是对我来讲)大多数界面设计工具都是这样做的,而另外的一些程序像Visual studio实际上才是奇怪的.<br />&nbsp;&nbsp; 无论如何我们回到向导上来, 接下来要做的事是添加一个标签来告诉用户去点击按钮(当然我们可以把文字放到按钮上,但是只有一个控件有多少乐趣啊?!). 由于GTK使用容器来打包器件, 我们要做的第一件事就是添加一个容器. 因为我们要把标签放到按钮上,所以使用了一个有两行的纵向盒子(Vertical Box). 你可以通过首先点击它在Glade面板上图标然后再点击一些主窗口把它添加上去. 这时候会有一个小对话框弹出来问你需要多少行, 现在我们需要2行.<br />&nbsp;&nbsp; 接下来就是通过点击Glade面板上的标签按钮然后再点击刚才加上去的窗口的第一行把标签添加上去. 标签的名字就使用默认的名字”label1”, 把它的文字(text)修改为”Please click on the button!”. 修改标签上的文字可以在属性窗口里完成, 你可能还没有注意到这个窗口, 它可以显示并允许修改当前选中的控件.<br />&nbsp;&nbsp; 再接下来就是再使用和添加标签相同的方法把按钮添加到第二行去(当然不能是第一行了). 我们把这个按钮命名为btnHelloworld,把它上面的文字修改为”Click me!”.<br />&nbsp;&nbsp;&nbsp; 现在我们需要设置工程选项了. 我把这个工程命名为PyHelloWorld,并把它保存在”my projects/PyHelloWorld”文件夹中:</p>
<table cellSpacing=1 cellPadding=1 width=400 border=0>
<tbody>
<tr>
<td>&nbsp;</p>
<p align=center><img style="WIDTH: 532px; HEIGHT: 476px" height=524 src="http://www.cublog.cn/u/5462/photo/060804200833.png" width=1024></p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp; &nbsp;然后你就可以在PyHelloWorld目录里看到有两个文件被创建, 一个是扩展名为.gladep的glade的工程文件,另一个是扩展名为.glade的glade界面XML文件.<br />&nbsp;&nbsp; 现在我们需要创建一个python程序,它装载这个glade文件然后显示它. 正面我就在这个目录里创建了一个名为PyHelloWorld.py的文件:</p>
<table cellSpacing=1 cellPadding=1 width="100%" border=0>
<tbody>
<tr>
<td>&nbsp;</p>
<p align=center><img src="http://www.cublog.cn/u/5462/photo/060804200858.png"></p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp; &nbsp; 现在我们首先需要导入在这个工程里需要的所有库:</p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
<tbody>
<tr>
<td>
<pre><span class=hl-comment><font color=#ff0000>#!/usr/bin/env python

</font></span><span class=hl-reserved><font color=#0000ff>import </font></span><span class=hl-identifier>sys

</span><span class=hl-reserved><font color=#0000ff>try</font></span><span class=hl-default>:

 </span><span class=hl-reserved><font color=#0000ff>import </font></span><span class=hl-identifier>pygtk

  pygtk</span><span class=hl-default>.</span><span class=hl-identifier>require</span><span class=hl-brackets>(</span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>2.0</span><span class=hl-quotes>"</span></font><span class=hl-brackets>)

</span><span class=hl-reserved><font color=#0000ff>except</font></span><span class=hl-default>:

  </span><span class=hl-reserved><font color=#0000ff>pass

try</font></span><span class=hl-default>:

</span><span class=hl-reserved><font color=#0000ff>import </font></span><span class=hl-identifier>gtk

  </span><span class=hl-reserved><font color=#0000ff>import </font></span><span class=hl-identifier>gtk</span><span class=hl-default>.</span><span class=hl-identifier>glade

</span><span class=hl-reserved><font color=#0000ff>except</font></span><span class=hl-default>:

</span><span class=hl-identifier>sys</span><span class=hl-default>.</span><span class=hl-identifier>exit</span><span class=hl-brackets>(</span><span class=hl-number><font color=#800000>1</font></span><span class=hl-brackets>)</span></pre>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;&nbsp;&nbsp; 接下来我们要做的就是创建主要的类. 我把它命名为HelloWorldGTK. 我们通过写它的__init__函数来装载glade文件:</p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 96.95%; BORDER-BOTTOM: #999 1px solid; HEIGHT: 299px" align=center>
<tbody>
<tr>
<td>
<pre><span class=hl-reserved><font color=#0000ff>class </font></span><span class=hl-identifier>HellowWorldGTK</span><span class=hl-default>:

</span><font color=#008000><span class=hl-quotes>"""</span><span class=hl-string>This is an Hello World GTK application</span></font><span class=hl-quotes><font color=#008000>"""

</font></span><span class=hl-reserved><font color=#0000ff>def </font></span><span class=hl-identifier>__init__</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-brackets>)</span><span class=hl-default>:

</span><span class=hl-comment><font color=#ff0000>#Set the Glade file

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>gladefile</span><span class=hl-default> = </span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>pyhelloworld.glade</span></font><span class=hl-quotes><font color=#008000>"

        </font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wTree</span><span class=hl-default> = </span><span class=hl-identifier>gtk</span><span class=hl-default>.</span><span class=hl-identifier>glade</span><span class=hl-default>.</span><span class=hl-identifier>XML</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>gladefile</span><span class=hl-brackets>)

</span><span class=hl-comment><font color=#ff0000>#Get the Main Window, and connect the "destroy" event

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>window</span><span class=hl-default> = </span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wTree</span><span class=hl-default>.</span><span class=hl-identifier>get_widget</span><span class=hl-brackets>(</span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>MainWindow</span><span class=hl-quotes>"</span></font><span class=hl-brackets>)

</span><span class=hl-identifier>if </span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>window</span><span class=hl-brackets>)</span><span class=hl-default>:

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>window</span><span class=hl-default>.</span><span class=hl-identifier>connect</span><span class=hl-brackets>(</span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>destroy</span><span class=hl-quotes>"</span></font><span class=hl-code>, </span><span class=hl-identifier>gtk</span><span class=hl-code>.</span><span class=hl-identifier>main_quit</span><span class=hl-brackets>)</span></pre>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;&nbsp; 上面的代码里, 我们做的第一件事(定义类以后)是指定我们要使用的glade文件并使用它创建一个gtk.glade.XML对象. 正面是pyGTK2参考里对这个对象的描述:</p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
<tbody>
<tr>
<td><em>&nbsp;这个对象代表一个XML接口描述的实例. 当一个此类对象被创建时, 会读XML文件,接口也会被创建出来. Gtk.glade.XML对象提供了一个可以通过在xml描述中赋给物件的名称访问这些物件的接口.<br />&nbsp; 此gtk.glade.XML对象也可以用来关联在XML描述中已命名的信号和信号处理器. Glade库(libglade)也提供了一个可以在程序的符号表中查找信号处理器名称并自动的把尽可能多的信号处理器关联起来的接口.</em></td>
</tr>
</tbody>
</table>
<p>&nbsp;&nbsp;&nbsp;因此当创建完gtk.glade.XML对象后我们就需要创建并装载主界面.<br />&nbsp;&nbsp;接下来就是实例化主窗口并把它的销毁事件与get.main_quit()函数关联起来.这样就会在关闭主窗口时退出这个程序. 否则的话在主窗口关闭后程序还会继续运行(这显然不是我们所希望的).<br />&nbsp;&nbsp;这些就是HelloWorldGTK类完成的工作. 接下来我们就需要创建一个这个类的实例然后开始GTK的主循环:</p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
<tbody>
<tr>
<td>
<pre><span class=hl-reserved><font color=#0000ff>if </font></span><span class=hl-identifier>__name__</span><span class=hl-default> == </span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>__main__</span><span class=hl-quotes>"</span></font><span class=hl-default>:

</span><span class=hl-identifier>hwg</span><span class=hl-default> = </span><span class=hl-identifier>HellowWorldGTK</span><span class=hl-brackets>()

</span><span class=hl-identifier>gtk</span><span class=hl-default>.</span><span class=hl-identifier>main</span><span class=hl-brackets>()</span></pre>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;&nbsp; 下面就是程序的结果, 现在来说还算是相当简单. 如果你运行这个文件,你会看到这个小的GTK窗口, 现在除了在你关闭窗口时正常退出外它什么也不能做:</p>
<table cellSpacing=1 cellPadding=1 width="100%" border=0>
<tbody>
<tr>
<td>&nbsp;</p>
<p align=center><img src="http://www.cublog.cn/u/5462/photo/060804200920.png"></p>
</td>
</tr>
</tbody>
</table>
<p>to be continue&#8230;.(太晚了,回家先)</p>
<div></div>
<div></div>
<div></div>
<div></div>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark to:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fblog.pangwa.com%2F2006%2F08%2F06%2F%25e4%25bd%25bf%25e7%2594%25a8pygtk%25e5%2592%258cglade%25e5%2588%259b%25e5%25bb%25ba%25e7%2594%25a8%25e6%2588%25b7%25e7%2595%258c%25e9%259d%25a2%2F&amp;title=%E4%BD%BF%E7%94%A8PyGTK%E5%92%8CGlade%E5%88%9B%E5%BB%BA%E7%94%A8%E6%88%B7%E7%95%8C%E9%9D%A2" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.pangwa.com%2F2006%2F08%2F06%2F%25e4%25bd%25bf%25e7%2594%25a8pygtk%25e5%2592%258cglade%25e5%2588%259b%25e5%25bb%25ba%25e7%2594%25a8%25e6%2588%25b7%25e7%2595%258c%25e9%259d%25a2%2F&amp;title=%E4%BD%BF%E7%94%A8PyGTK%E5%92%8CGlade%E5%88%9B%E5%BB%BA%E7%94%A8%E6%88%B7%E7%95%8C%E9%9D%A2" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fblog.pangwa.com%2F2006%2F08%2F06%2F%25e4%25bd%25bf%25e7%2594%25a8pygtk%25e5%2592%258cglade%25e5%2588%259b%25e5%25bb%25ba%25e7%2594%25a8%25e6%2588%25b7%25e7%2595%258c%25e9%259d%25a2%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fblog.pangwa.com%2F2006%2F08%2F06%2F%25e4%25bd%25bf%25e7%2594%25a8pygtk%25e5%2592%258cglade%25e5%2588%259b%25e5%25bb%25ba%25e7%2594%25a8%25e6%2588%25b7%25e7%2595%258c%25e9%259d%25a2%2F&amp;title=%E4%BD%BF%E7%94%A8PyGTK%E5%92%8CGlade%E5%88%9B%E5%BB%BA%E7%94%A8%E6%88%B7%E7%95%8C%E9%9D%A2" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fblog.pangwa.com%2F2006%2F08%2F06%2F%25e4%25bd%25bf%25e7%2594%25a8pygtk%25e5%2592%258cglade%25e5%2588%259b%25e5%25bb%25ba%25e7%2594%25a8%25e6%2588%25b7%25e7%2595%258c%25e9%259d%25a2%2F&amp;title=%E4%BD%BF%E7%94%A8PyGTK%E5%92%8CGlade%E5%88%9B%E5%BB%BA%E7%94%A8%E6%88%B7%E7%95%8C%E9%9D%A2" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fblog.pangwa.com%2F2006%2F08%2F06%2F%25e4%25bd%25bf%25e7%2594%25a8pygtk%25e5%2592%258cglade%25e5%2588%259b%25e5%25bb%25ba%25e7%2594%25a8%25e6%2588%25b7%25e7%2595%258c%25e9%259d%25a2%2F&amp;title=%E4%BD%BF%E7%94%A8PyGTK%E5%92%8CGlade%E5%88%9B%E5%BB%BA%E7%94%A8%E6%88%B7%E7%95%8C%E9%9D%A2" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fblog.pangwa.com%2F2006%2F08%2F06%2F%25e4%25bd%25bf%25e7%2594%25a8pygtk%25e5%2592%258cglade%25e5%2588%259b%25e5%25bb%25ba%25e7%2594%25a8%25e6%2588%25b7%25e7%2595%258c%25e9%259d%25a2%2F&amp;t=%E4%BD%BF%E7%94%A8PyGTK%E5%92%8CGlade%E5%88%9B%E5%BB%BA%E7%94%A8%E6%88%B7%E7%95%8C%E9%9D%A2" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://blog.pangwa.com/2006/08/06/%e4%bd%bf%e7%94%a8pygtk%e5%92%8cglade%e5%88%9b%e5%bb%ba%e7%94%a8%e6%88%b7%e7%95%8c%e9%9d%a2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用PyGTK和Glade创建用户界面(part 2)</title>
		<link>http://blog.pangwa.com/2006/08/06/%e4%bd%bf%e7%94%a8pygtk%e5%92%8cglade%e5%88%9b%e5%bb%ba%e7%94%a8%e6%88%b7%e7%95%8c%e9%9d%a2part-2/</link>
		<comments>http://blog.pangwa.com/2006/08/06/%e4%bd%bf%e7%94%a8pygtk%e5%92%8cglade%e5%88%9b%e5%bb%ba%e7%94%a8%e6%88%b7%e7%95%8c%e9%9d%a2part-2/#comments</comments>
		<pubDate>Sun, 06 Aug 2006 16:17:00 +0000</pubDate>
		<dc:creator>pangwa</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://blog.pangwa.com/?p=134</guid>
		<description><![CDATA[原文 &#160; 接上篇:) &#160;&#160;&#160;接下来就要把这个按钮的点击事件和一个函数关联起来. 我们需要再次使用Glade编辑界面来实现这个功能.&#160;&#160; 首先在主窗口中选中这个按钮对象然后再在属性窗口中选择”信号”标签页. 在这里我们需要通过点击信息浏览按钮(…)然后选择”Clicked”来添加一个信号.这就默认创建了一个名字为”on_btnHelloWorld_clicked”的处理器”. 我们可以修改这个处理器的名字但是现在使用默认的名字就可以了.]]></description>
			<content:encoded><![CDATA[<div><a href="http://www.learningpython.com/2006/05/07/creating-a-gui-using-pygtk-and-glade/" target=_blank>原文</a></div>
<div>&nbsp;</div>
<div>接上篇:)</div>
<div>&nbsp;&nbsp;&nbsp;接下来就要把这个按钮的点击事件和一个函数关联起来. 我们需要再次使用Glade编辑界面来实现这个功能.<br />&nbsp;&nbsp; 首先在主窗口中选中这个按钮对象然后再在属性窗口中选择”信号”标签页. 在这里我们需要通过点击信息浏览按钮(…)然后选择”Clicked”来添加一个信号.这就默认创建了一个名字为”on_btnHelloWorld_clicked”的处理器”. 我们可以修改这个处理器的名字但是现在使用默认的名字就可以了.</div>
<div>
<p align=center><img src="http://www.cublog.cn/u/5462/upfile/060806161610.png" onload="javascript:if(this.width>500)this.width=500;&#8221; border=0></p>
<p>&nbsp; Glade的工作到此就结束了. 现在我们需要把这个事件和在代码中一些东西关联起来. 很幸运的是这个可以很简单的用 <a href="http://www.pygtk.org/pygtk2reference/class-gladexml.html#method-gladexml--signal-autoconnect" target=_blank>gtk.glade.XML.signal_autoconnect</a>函数来实现.</div>
<div>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
<tbody>
<tr>
<td>
<pre><span class=hl-comment><font color=#ff0000>#Create our dictionay and connect it

</font></span><span class=hl-identifier>dic</span><span class=hl-default> = { </span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>on_btnHelloWorld_clicked</span><span class=hl-quotes>"</span></font><span class=hl-default> : </span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>btnHelloWorld_clicked</span><span class=hl-default>,

</span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>on_MainWindow_destroy</span><span class=hl-quotes>"</span></font><span class=hl-default> : </span><span class=hl-identifier>gtk</span><span class=hl-default>.</span><span class=hl-identifier>main_quit</span><span class=hl-default> }

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wTree</span><span class=hl-default>.</span><span class=hl-identifier>signal_autoconnect</span><span class=hl-brackets>(</span><span class=hl-identifier>dic</span><span class=hl-brackets>)</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>&nbsp;简单的讲, 这个词典是由事件名和所要关联的函数构成的. 你可以看到我们把按钮的点击事件和一个函数关联起来,然后再把”on_MainWindow_destory”事件和gtk.mainquit()函数关联起来. 这个是我们原来在关闭掉窗口时程序代码的一个替换, 如果你还想使用原来的词典, 你应当在glade中为主窗口添加一个destory事件.<br />&nbsp;&nbsp; 下一件事就是为类HeloowWolrdGTK创建btnHelloWorld_clicked函数:</p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
<tbody>
<tr>
<td>
<pre><span class=hl-reserved><font color=#0000ff>def </font></span><span class=hl-identifier>btnHelloWorld_clicked</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>, </span><span class=hl-identifier>widget</span><span class=hl-brackets>)</span><span class=hl-default>:

</span><span class=hl-reserved><font color=#0000ff>print </font></span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>Hello World!</span><span class=hl-quotes>"</span></font></pre>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;真是太简单了! 现在当你运行它的时候, 点击一下”Click Me!”按钮你可以看到在命令行中输出了”Hello World!”.<br />这就是本节课的内容, 但是现在我真的喜欢上了使用PyGTK和Glade工作. 下面是完整的程序代码:</p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
<tbody>
<tr>
<td>
<pre><span class=hl-comment><font color=#ff0000>#!/usr/bin/env python

</font></span><span class=hl-reserved><font color=#0000ff>import </font></span><span class=hl-identifier>sys

</span><span class=hl-reserved><font color=#0000ff>try</font></span><span class=hl-default>:

 </span><span class=hl-reserved><font color=#0000ff>import </font></span><span class=hl-identifier>pygtk

  pygtk</span><span class=hl-default>.</span><span class=hl-identifier>require</span><span class=hl-brackets>(</span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>2.0</span><span class=hl-quotes>"</span></font><span class=hl-brackets>)

</span><span class=hl-reserved><font color=#0000ff>except</font></span><span class=hl-default>:

  </span><span class=hl-reserved><font color=#0000ff>pass

try</font></span><span class=hl-default>:

</span><span class=hl-reserved><font color=#0000ff>import </font></span><span class=hl-identifier>gtk

  </span><span class=hl-reserved><font color=#0000ff>import </font></span><span class=hl-identifier>gtk</span><span class=hl-default>.</span><span class=hl-identifier>glade

</span><span class=hl-reserved><font color=#0000ff>except</font></span><span class=hl-default>:

</span><span class=hl-identifier>sys</span><span class=hl-default>.</span><span class=hl-identifier>exit</span><span class=hl-brackets>(</span><span class=hl-number><font color=#800000>1</font></span><span class=hl-brackets>)

</span><span class=hl-reserved><font color=#0000ff>class </font></span><span class=hl-identifier>HellowWorldGTK</span><span class=hl-default>:

</span><font color=#008000><span class=hl-quotes>"""</span><span class=hl-string>This is an Hello World GTK application</span></font><span class=hl-quotes><font color=#008000>"""

</font></span><span class=hl-reserved><font color=#0000ff>def </font></span><span class=hl-identifier>__init__</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-brackets>)</span><span class=hl-default>:

</span><span class=hl-comment><font color=#ff0000>#Set the Glade file

</font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>gladefile</span><span class=hl-default> = </span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>pyhelloworld.glade</span></font><span class=hl-quotes><font color=#008000>"

        </font></span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wTree</span><span class=hl-default> = </span><span class=hl-identifier>gtk</span><span class=hl-default>.</span><span class=hl-identifier>glade</span><span class=hl-default>.</span><span class=hl-identifier>XML</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>.</span><span class=hl-identifier>gladefile</span><span class=hl-brackets>)

</span><span class=hl-comment><font color=#ff0000>#Create our dictionay and connect it

</font></span><span class=hl-identifier>dic</span><span class=hl-default> = { </span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>on_btnHelloWorld_clicked</span><span class=hl-quotes>"</span></font><span class=hl-default> : </span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>btnHelloWorld_clicked</span><span class=hl-default>,

</span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>on_MainWindow_destroy</span><span class=hl-quotes>"</span></font><span class=hl-default> : </span><span class=hl-identifier>gtk</span><span class=hl-default>.</span><span class=hl-identifier>main_quit</span><span class=hl-default> }

</span><span class=hl-identifier>self</span><span class=hl-default>.</span><span class=hl-identifier>wTree</span><span class=hl-default>.</span><span class=hl-identifier>signal_autoconnect</span><span class=hl-brackets>(</span><span class=hl-identifier>dic</span><span class=hl-brackets>)

</span><span class=hl-reserved><font color=#0000ff>def </font></span><span class=hl-identifier>btnHelloWorld_clicked</span><span class=hl-brackets>(</span><span class=hl-identifier>self</span><span class=hl-code>, </span><span class=hl-identifier>widget</span><span class=hl-brackets>)</span><span class=hl-default>:

</span><span class=hl-reserved><font color=#0000ff>print </font></span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>Hello World!</span></font><span class=hl-quotes><font color=#008000>"

</font></span><span class=hl-reserved><font color=#0000ff>if </font></span><span class=hl-identifier>__name__</span><span class=hl-default> == </span><font color=#008000><span class=hl-quotes>"</span><span class=hl-string>__main__</span><span class=hl-quotes>"</span></font><span class=hl-default>:

</span><span class=hl-identifier>hwg</span><span class=hl-default> = </span><span class=hl-identifier>HellowWorldGTK</span><span class=hl-brackets>()

</span><span class=hl-identifier>gtk</span><span class=hl-default>.</span><span class=hl-identifier>main</span><span class=hl-brackets>()</span></pre>
</td>
</tr>
</tbody>
</table>
<p>有用的链接:</p>
<p><font color=#0066cc><a href="http://www.linuxjournal.com/article/6586" target=_blank>http://www.linuxjournal.com/article/6586</a></font><br /><font color=#0066cc><a href="http://www.async.com.br/~kiko/pygtk-web/articles/bitpodder/BitPodder.htm" target=_blank>http://www.async.com.br/~kiko/pygtk-web/articles/bitpodder/BitPodder.htm</a></font><br /><a href="http://www.linuxjournal.com/article/7421"><font color=#0066cc>ht</a><a href="tp://www.linuxjournal.com/article/7421" target=_blank>tp://www.linuxjournal.com/article/7421</a></font><br /><a href="http://www.pygtk.org/articles.html" target=_blank>http://www.pygtk.org/articles.html</a><br /><a href="http://www.pygtk.org/tutorial.html" target=_blank>http://www.pygtk.org/tutorial.html </a></p>
<div></div>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark to:</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fblog.pangwa.com%2F2006%2F08%2F06%2F%25e4%25bd%25bf%25e7%2594%25a8pygtk%25e5%2592%258cglade%25e5%2588%259b%25e5%25bb%25ba%25e7%2594%25a8%25e6%2588%25b7%25e7%2595%258c%25e9%259d%25a2part-2%2F&amp;title=%E4%BD%BF%E7%94%A8PyGTK%E5%92%8CGlade%E5%88%9B%E5%BB%BA%E7%94%A8%E6%88%B7%E7%95%8C%E9%9D%A2%28part+2%29" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.pangwa.com%2F2006%2F08%2F06%2F%25e4%25bd%25bf%25e7%2594%25a8pygtk%25e5%2592%258cglade%25e5%2588%259b%25e5%25bb%25ba%25e7%2594%25a8%25e6%2588%25b7%25e7%2595%258c%25e9%259d%25a2part-2%2F&amp;title=%E4%BD%BF%E7%94%A8PyGTK%E5%92%8CGlade%E5%88%9B%E5%BB%BA%E7%94%A8%E6%88%B7%E7%95%8C%E9%9D%A2%28part+2%29" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fblog.pangwa.com%2F2006%2F08%2F06%2F%25e4%25bd%25bf%25e7%2594%25a8pygtk%25e5%2592%258cglade%25e5%2588%259b%25e5%25bb%25ba%25e7%2594%25a8%25e6%2588%25b7%25e7%2595%258c%25e9%259d%25a2part-2%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fblog.pangwa.com%2F2006%2F08%2F06%2F%25e4%25bd%25bf%25e7%2594%25a8pygtk%25e5%2592%258cglade%25e5%2588%259b%25e5%25bb%25ba%25e7%2594%25a8%25e6%2588%25b7%25e7%2595%258c%25e9%259d%25a2part-2%2F&amp;title=%E4%BD%BF%E7%94%A8PyGTK%E5%92%8CGlade%E5%88%9B%E5%BB%BA%E7%94%A8%E6%88%B7%E7%95%8C%E9%9D%A2%28part+2%29" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fblog.pangwa.com%2F2006%2F08%2F06%2F%25e4%25bd%25bf%25e7%2594%25a8pygtk%25e5%2592%258cglade%25e5%2588%259b%25e5%25bb%25ba%25e7%2594%25a8%25e6%2588%25b7%25e7%2595%258c%25e9%259d%25a2part-2%2F&amp;title=%E4%BD%BF%E7%94%A8PyGTK%E5%92%8CGlade%E5%88%9B%E5%BB%BA%E7%94%A8%E6%88%B7%E7%95%8C%E9%9D%A2%28part+2%29" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fblog.pangwa.com%2F2006%2F08%2F06%2F%25e4%25bd%25bf%25e7%2594%25a8pygtk%25e5%2592%258cglade%25e5%2588%259b%25e5%25bb%25ba%25e7%2594%25a8%25e6%2588%25b7%25e7%2595%258c%25e9%259d%25a2part-2%2F&amp;title=%E4%BD%BF%E7%94%A8PyGTK%E5%92%8CGlade%E5%88%9B%E5%BB%BA%E7%94%A8%E6%88%B7%E7%95%8C%E9%9D%A2%28part+2%29" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fblog.pangwa.com%2F2006%2F08%2F06%2F%25e4%25bd%25bf%25e7%2594%25a8pygtk%25e5%2592%258cglade%25e5%2588%259b%25e5%25bb%25ba%25e7%2594%25a8%25e6%2588%25b7%25e7%2595%258c%25e9%259d%25a2part-2%2F&amp;t=%E4%BD%BF%E7%94%A8PyGTK%E5%92%8CGlade%E5%88%9B%E5%BB%BA%E7%94%A8%E6%88%B7%E7%95%8C%E9%9D%A2%28part+2%29" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://blog.pangwa.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://blog.pangwa.com/2006/08/06/%e4%bd%bf%e7%94%a8pygtk%e5%92%8cglade%e5%88%9b%e5%bb%ba%e7%94%a8%e6%88%b7%e7%95%8c%e9%9d%a2part-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

