<?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>learning python &#187; tkinter</title>
	<atom:link href="http://www.learningpython.com/category/python/tkinter/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.learningpython.com</link>
	<description>one man's journey into python...</description>
	<lastBuildDate>Mon, 26 Apr 2010 01:21:51 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Using Menus in Tkinter</title>
		<link>http://www.learningpython.com/2006/03/27/using-menus-in-tkinter/</link>
		<comments>http://www.learningpython.com/2006/03/27/using-menus-in-tkinter/#comments</comments>
		<pubDate>Tue, 28 Mar 2006 03:59:53 +0000</pubDate>
		<dc:creator>selsine</dc:creator>
				<category><![CDATA[beginnings]]></category>
		<category><![CDATA[gui]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[tkinter]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.learningpython.com/?p=22</guid>
		<description><![CDATA[
			
				
			
		
This is a quick post on how to use menu&#8217;s in Tkinter, if you are unfamiliar with  Tkinter you might want to check out some of my other Tkinter related posts.
We are going to start of with a basic python Tkinter app:
#! /usr/bin/env python
from Tkinter import *

class App(Frame):

	def __init__(self, master):
		
		&#34;&#34;&#34;Initialise the base class&#34;&#34;&#34;
  [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.learningpython.com%2F2006%2F03%2F27%2Fusing-menus-in-tkinter%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.learningpython.com%2F2006%2F03%2F27%2Fusing-menus-in-tkinter%2F&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>This is a quick post on how to use menu&#8217;s in Tkinter, if you are unfamiliar with  Tkinter you might want to check out some of my other Tkinter related <a href="http://www.learningpython.com/category/python/tkinter/">posts</a>.</p>
<p>We are going to start of with a basic python Tkinter app:</p>
<div class="hl-surround" style="height:280px;"><div class="hl-main"><pre><span class="hl-comment">#! /usr/bin/env python
</span><span class="hl-reserved">from </span><span class="hl-identifier">Tkinter </span><span class="hl-reserved">import</span><span class="hl-default"> *

</span><span class="hl-reserved">class </span><span class="hl-identifier">App</span><span class="hl-brackets">(</span><span class="hl-identifier">Frame</span><span class="hl-brackets">)</span><span class="hl-default">:

	</span><span class="hl-reserved">def </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">master</span><span class="hl-brackets">)</span><span class="hl-default">:
		
		</span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Initialise the base class</span><span class="hl-quotes">&quot;&quot;&quot;
        	</span><span class="hl-identifier">Frame</span><span class="hl-default">.</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">master</span><span class="hl-brackets">)
        
        	</span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Set the Window Title</span><span class="hl-quotes">&quot;&quot;&quot;
        	</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">master</span><span class="hl-default">.</span><span class="hl-identifier">title</span><span class="hl-brackets">(</span><span class="hl-quotes">&quot;</span><span class="hl-string">TkInter Menus</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)
		</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">configure</span><span class="hl-brackets">(</span><span class="hl-identifier">height</span><span class="hl-code">=</span><span class="hl-number">200</span><span class="hl-code">,</span><span class="hl-identifier">width</span><span class="hl-code">=</span><span class="hl-number">200</span><span class="hl-brackets">)
        	</span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Display the main window
        	with a little bit of padding</span><span class="hl-quotes">&quot;&quot;&quot;
        	</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">padx</span><span class="hl-code">=</span><span class="hl-number">15</span><span class="hl-code">, </span><span class="hl-identifier">pady</span><span class="hl-code">=</span><span class="hl-number">15</span><span class="hl-code">,</span><span class="hl-identifier">sticky</span><span class="hl-code">=</span><span class="hl-identifier">N</span><span class="hl-code">+</span><span class="hl-identifier">S</span><span class="hl-code">+</span><span class="hl-identifier">E</span><span class="hl-code">+</span><span class="hl-identifier">W</span><span class="hl-brackets">)

</span><span class="hl-reserved">if </span><span class="hl-identifier">__name__</span><span class="hl-default"> == </span><span class="hl-quotes">&quot;</span><span class="hl-string">__main__</span><span class="hl-quotes">&quot;</span><span class="hl-default">:
	</span><span class="hl-identifier">root</span><span class="hl-default"> = </span><span class="hl-identifier">Tk</span><span class="hl-brackets">()
	</span><span class="hl-identifier">app</span><span class="hl-default"> = </span><span class="hl-identifier">App</span><span class="hl-brackets">(</span><span class="hl-identifier">root</span><span class="hl-brackets">)
	</span><span class="hl-identifier">root</span><span class="hl-default">.</span><span class="hl-identifier">mainloop</span><span class="hl-brackets">()</span></pre></div></div>
<p><img style="margin: 0pt 10px 10px 0pt; float: left" src="http://www.learningpython.com/images/menu_01.png" alt="Python Tkinter Window" border="0" />What this gives us is basically a plain old blank Tkinter window, not too exciting.  The next thing we are going to do is add create our root menu, before going any further you might want to read the excellent information about <a href="http://www.pythonware.com/library/tkinter/introduction/menu.htm">menu widgets</a> in <a href="http://www.pythonware.com/library/tkinter/introduction/index.htm">PythonWare&#8217;s Tkinter introduction</a>.  You don&#8217;t have to but it&#8217;s an excellent source of information.</p>
<p><span id="more-22"></span></p>
<p>To create the root menu we simply add the following command to our __init__ function:</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-comment">#Create the Menu base
</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">menu</span><span class="hl-default"> = </span><span class="hl-identifier">Menu</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-brackets">)
</span><span class="hl-comment">#Add the Menu
</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">master</span><span class="hl-default">.</span><span class="hl-identifier">config</span><span class="hl-brackets">(</span><span class="hl-identifier">menu</span><span class="hl-code">=</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">menu</span><span class="hl-brackets">)</span></pre></div></div>
<p>No we are greeted with, well a blank window with a blank menu, the reason for this is because we haven&#8217;t added anything to it.  What we are going to add to it is a menu, but not just any menu, a menu who&#8217;s parent is our menu base:</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-comment">#Create our Python menu
</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">tkMenu</span><span class="hl-default"> = </span><span class="hl-identifier">Menu</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">menu</span><span class="hl-brackets">)
</span><span class="hl-comment">#Add our Menu to the Base Menu
</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">menu</span><span class="hl-default">.</span><span class="hl-identifier">add_cascade</span><span class="hl-brackets">(</span><span class="hl-identifier">label</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">TkMenu</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-identifier">menu</span><span class="hl-code">=</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">tkMenu</span><span class="hl-brackets">)</span></pre></div></div>
<p><img style="margin: 0pt 10px 10px 0pt; float: left" src="http://www.learningpython.com/images/menu_02.png" alt="Python Tkinter Window" border="0" />Now we&#8217;re getting somewhere at least we have a menu now!  The next step is to add items to our TkMenu:</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-comment">#Add items to the menu
</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">tkMenu</span><span class="hl-default">.</span><span class="hl-identifier">add_command</span><span class="hl-brackets">(</span><span class="hl-identifier">label</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">Simple</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-identifier">command</span><span class="hl-code">=</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">Simple</span><span class="hl-brackets">)
</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">tkMenu</span><span class="hl-default">.</span><span class="hl-identifier">add_separator</span><span class="hl-brackets">()
</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">tkMenu</span><span class="hl-default">.</span><span class="hl-identifier">add_command</span><span class="hl-brackets">(</span><span class="hl-identifier">label</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">Menu</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-identifier">command</span><span class="hl-code">=</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">Menu</span><span class="hl-brackets">)</span></pre></div></div>
<p><img style="margin: 0pt 10px 10px 0pt; float: left" src="http://www.learningpython.com/images/menu_03.png" alt="Python Tkinter Menu" border="0" />That&#8217;s basically it!  Adding the menu item&#8217;s is pretty simple, we specify it&#8217;s text and then tell it what function to call when the user clicks on the menu item.  The two functions that I used don&#8217;t really do anything besides show a message box:</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-reserved">def </span><span class="hl-identifier">Simple</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-identifier">tkMessageBox</span><span class="hl-default">.</span><span class="hl-identifier">showinfo</span><span class="hl-brackets">(</span><span class="hl-quotes">&quot;</span><span class="hl-string">Simple</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-quotes">&quot;</span><span class="hl-string">Simple</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)
</span><span class="hl-reserved">def </span><span class="hl-identifier">Menu</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-identifier">tkMessageBox</span><span class="hl-default">.</span><span class="hl-identifier">showinfo</span><span class="hl-brackets">(</span><span class="hl-quotes">&quot;</span><span class="hl-string">Menu</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-quotes">&quot;</span><span class="hl-string">Menu</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)</span></pre></div></div>
<p>Well that&#8217;s it for this post, here is the code in its entirety:</p>
<div class="hl-surround" style="height:280px;"><div class="hl-main"><pre><span class="hl-comment">#! /usr/bin/env python
</span><span class="hl-reserved">from </span><span class="hl-identifier">Tkinter </span><span class="hl-reserved">import</span><span class="hl-default"> *

</span><span class="hl-reserved">import </span><span class="hl-identifier">tkMessageBox

</span><span class="hl-reserved">class </span><span class="hl-identifier">App</span><span class="hl-brackets">(</span><span class="hl-identifier">Frame</span><span class="hl-brackets">)</span><span class="hl-default">:


	</span><span class="hl-reserved">def </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">master</span><span class="hl-brackets">)</span><span class="hl-default">:
		
		</span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Initialise the base class</span><span class="hl-quotes">&quot;&quot;&quot;
        	</span><span class="hl-identifier">Frame</span><span class="hl-default">.</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">master</span><span class="hl-brackets">)
        
        	</span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Set the Window Title</span><span class="hl-quotes">&quot;&quot;&quot;
        	</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">master</span><span class="hl-default">.</span><span class="hl-identifier">title</span><span class="hl-brackets">(</span><span class="hl-quotes">&quot;</span><span class="hl-string">TkInter Menus</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)
		</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">configure</span><span class="hl-brackets">(</span><span class="hl-identifier">height</span><span class="hl-code">=</span><span class="hl-number">200</span><span class="hl-code">,</span><span class="hl-identifier">width</span><span class="hl-code">=</span><span class="hl-number">200</span><span class="hl-brackets">)
        	</span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Display the main window
        	with a little bit of padding</span><span class="hl-quotes">&quot;&quot;&quot;
        	</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">padx</span><span class="hl-code">=</span><span class="hl-number">15</span><span class="hl-code">, </span><span class="hl-identifier">pady</span><span class="hl-code">=</span><span class="hl-number">15</span><span class="hl-code">,</span><span class="hl-identifier">sticky</span><span class="hl-code">=</span><span class="hl-identifier">N</span><span class="hl-code">+</span><span class="hl-identifier">S</span><span class="hl-code">+</span><span class="hl-identifier">E</span><span class="hl-code">+</span><span class="hl-identifier">W</span><span class="hl-brackets">)       
 
       		</span><span class="hl-comment">#Create the Menu base
        	</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">menu</span><span class="hl-default"> = </span><span class="hl-identifier">Menu</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-brackets">)
        	</span><span class="hl-comment">#Add the Menu
        	</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">master</span><span class="hl-default">.</span><span class="hl-identifier">config</span><span class="hl-brackets">(</span><span class="hl-identifier">menu</span><span class="hl-code">=</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">menu</span><span class="hl-brackets">)
        	
		</span><span class="hl-comment">#Create our Python menu
		</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">tkMenu</span><span class="hl-default"> = </span><span class="hl-identifier">Menu</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">menu</span><span class="hl-brackets">)
		</span><span class="hl-comment">#Add our Menu to the Base Menu
        	</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">menu</span><span class="hl-default">.</span><span class="hl-identifier">add_cascade</span><span class="hl-brackets">(</span><span class="hl-identifier">label</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">TkMenu</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-identifier">menu</span><span class="hl-code">=</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">tkMenu</span><span class="hl-brackets">)

		</span><span class="hl-comment">#Add items to the menu
		</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">tkMenu</span><span class="hl-default">.</span><span class="hl-identifier">add_command</span><span class="hl-brackets">(</span><span class="hl-identifier">label</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">Simple</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-identifier">command</span><span class="hl-code">=</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">Simple</span><span class="hl-brackets">)
		</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">tkMenu</span><span class="hl-default">.</span><span class="hl-identifier">add_separator</span><span class="hl-brackets">()
		</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">tkMenu</span><span class="hl-default">.</span><span class="hl-identifier">add_command</span><span class="hl-brackets">(</span><span class="hl-identifier">label</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">Menu</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-identifier">command</span><span class="hl-code">=</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">Menu</span><span class="hl-brackets">)
	
	</span><span class="hl-reserved">def </span><span class="hl-identifier">Simple</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-identifier">tkMessageBox</span><span class="hl-default">.</span><span class="hl-identifier">showinfo</span><span class="hl-brackets">(</span><span class="hl-quotes">&quot;</span><span class="hl-string">Simple</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-quotes">&quot;</span><span class="hl-string">Simple</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)
	</span><span class="hl-reserved">def </span><span class="hl-identifier">Menu</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-identifier">tkMessageBox</span><span class="hl-default">.</span><span class="hl-identifier">showinfo</span><span class="hl-brackets">(</span><span class="hl-quotes">&quot;</span><span class="hl-string">Menu</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-quotes">&quot;</span><span class="hl-string">Menu</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)        	


</span><span class="hl-reserved">if </span><span class="hl-identifier">__name__</span><span class="hl-default"> == </span><span class="hl-quotes">&quot;</span><span class="hl-string">__main__</span><span class="hl-quotes">&quot;</span><span class="hl-default">:
	</span><span class="hl-identifier">root</span><span class="hl-default"> = </span><span class="hl-identifier">Tk</span><span class="hl-brackets">()
	</span><span class="hl-identifier">app</span><span class="hl-default"> = </span><span class="hl-identifier">App</span><span class="hl-brackets">(</span><span class="hl-identifier">root</span><span class="hl-brackets">)
	</span><span class="hl-identifier">root</span><span class="hl-default">.</span><span class="hl-identifier">mainloop</span><span class="hl-brackets">()</span></pre></div></div>
<div style="float:right;margin:0px 0px 0px 0px;"><a href="http://www.google.com/reader/link?url=http://www.learningpython.com/2006/03/27/using-menus-in-tkinter/&title=Using Menus in Tkinter&srcTitle=learning python&srcURL=http://www.learningpython.com"target="_blank" rel=""><img border="0" src="http://www.learningpython.com/wp-content/plugins/wp-google-buzz/icon/12.png" style="opacity:1;filter:alpha(opacity=100)" onmouseover="this.style.opacity=0.8;this.filters.alpha.opacity=70" onmouseout="this.style.opacity=1;this.filters.alpha.opacity=100"/> </a></div>]]></content:encoded>
			<wfw:commentRss>http://www.learningpython.com/2006/03/27/using-menus-in-tkinter/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>RSS reader &#8211; Part Four &#8211; Integrating with the GUI</title>
		<link>http://www.learningpython.com/2006/03/05/rss-reader-part-four-integrating-with-the-gui/</link>
		<comments>http://www.learningpython.com/2006/03/05/rss-reader-part-four-integrating-with-the-gui/#comments</comments>
		<pubDate>Sun, 05 Mar 2006 19:25:50 +0000</pubDate>
		<dc:creator>selsine</dc:creator>
				<category><![CDATA[gui]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[rss reader]]></category>
		<category><![CDATA[tkinter]]></category>

		<guid isPermaLink="false">http://www.learningpython.com/?p=17</guid>
		<description><![CDATA[
			
				
			
		
So far our RSS reader has been completely command-line, which is functional but not as nice as we&#8217;d really like to have it.  So what we are going to do is integrate the GUI that I created in my two Tkinter GUI tutorials into our RSS application.
If you look at our GUI application you [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.learningpython.com%2F2006%2F03%2F05%2Frss-reader-part-four-integrating-with-the-gui%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.learningpython.com%2F2006%2F03%2F05%2Frss-reader-part-four-integrating-with-the-gui%2F&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>So far our <a href="http://www.learningpython.com/category/python/rss-reader/">RSS reader</a> has been completely command-line, which is functional but not as nice as we&#8217;d really like to have it.  So what we are going to do is integrate the GUI that I created in my two <a href="http://www.learningpython.com/category/python/tkinter/">Tkinter GUI tutorials</a> into our RSS application.</p>
<p>If you look at our GUI application you can see that at this point it actually has the basic look that we&#8217;ll want, what it doesn&#8217;t have is the functionality attached to to GUI.  So the first thing that we are going to do is let the user add an RSS site when the press the Add button.  We are going to pop up a dialog and let them enter the name of the RSS site and the address of the RSS feed.</p>
<p>In order to do that we are going to have to create a simple dialog.  Fortunately Tkinter has a nice simple dialog interface that makes creating simple pop-up dialogs quite easy.  It&#8217;s not as robust as you might like, but if you really wanted to do something very complicated you could simply create another window in the same way that we created our main window.  Since we don&#8217;t need anything fancy we&#8221;ll use the Simple dialog.</p>
<p>To start we must import the simple dialog into our program, so the following will have to be added to the top of the code:</p>
<div class="hl-surround" style="height:28px;"><div class="hl-main"><pre><span class="hl-reserved">import </span><span class="hl-identifier">tkSimpleDialog</span></pre></div></div>
<p>Now we could create create our dialog class in a totally new python file but since it&#8217;s going to be pretty simple I decided to keep all together in our one GUI file.  The first step in understanding the simple dialog is to read <a href="http://www.pythonware.com/library/tkinter/introduction/dialog-windows.htm">PythonWare&#8217;s introduction to the dialog window</a> it will explain all that you need to know to create a simple dialog.</p>
<p>Basically what you need to do is create a class whose parent is the simple dialog:</p>
<div class="hl-surround" style="height:28px;"><div class="hl-main"><pre><span class="hl-reserved">class </span><span class="hl-identifier">RSSItemDialog</span><span class="hl-brackets">(</span><span class="hl-identifier">tkSimpleDialog</span><span class="hl-code">.</span><span class="hl-identifier">Dialog</span><span class="hl-brackets">)</span><span class="hl-default">:</span></pre></div></div>
<p>Then you have to create a body function, this is the function that the tkSimpleDialog assumes will be used to create the body of the dialog.  The definition of the body function is as follows:</p>
<div class="hl-surround" style="height:28px;"><div class="hl-main"><pre><span class="hl-reserved">def </span><span class="hl-identifier">body</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">master</span><span class="hl-brackets">)</span><span class="hl-default">:</span></pre></div></div>
<p>Pretty simple so far right?  There are a few other important functions that you need to know about to create a simple dialog, like when to process the data after the Ok button is pressed:</p>
<div class="hl-surround" style="height:28px;"><div class="hl-main"><pre><span class="hl-reserved">def </span><span class="hl-builtin">apply</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-brackets">)</span><span class="hl-default">:</span></pre></div></div>
<p><span id="more-17"></span><br />
When the cancel or Ok button is pressed:</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-reserved">def </span><span class="hl-identifier">cancel</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">event</span><span class="hl-brackets">)</span><span class="hl-default">:
</span><span class="hl-reserved">def </span><span class="hl-identifier">ok</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">event</span><span class="hl-brackets">)</span><span class="hl-default">:</span></pre></div></div>
<p>You can read this <a href="http://epydoc.sourceforge.net/stdlib/public/tkSimpleDialog.Dialog-class.html">documentation</a> on sourceforge is you need to know more.  For our simple dialog we only care about the body and apply functions.  The only other feature that I wanted to add to this dialog was a simple way to set the default values of the RSS name and RSS Feed URL.</p>
<p>That way it would be easy to use this dialog to add and edit RSS sites.  To do so you have add and __init__ function to the class, it is defined as:</p>
<div class="hl-surround" style="height:28px;"><div class="hl-main"><pre><span class="hl-reserved">def </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">parent</span><span class="hl-code">, </span><span class="hl-identifier">title</span><span class="hl-code">=</span><span class="hl-reserved">None</span><span class="hl-code">, </span><span class="hl-identifier">RSSName</span><span class="hl-code">=</span><span class="hl-quotes">&quot;&quot;</span><span class="hl-code">, </span><span class="hl-identifier">RSSUrl</span><span class="hl-code">=</span><span class="hl-quotes">&quot;&quot;</span><span class="hl-brackets">)</span><span class="hl-default">:</span></pre></div></div>
<p>Where self, parent, and title are the parameters expected by tkSimpleDialog, title being the dialogs title, and RSSName and RSSUrl our new parameters.  So here is the RSSDialog&#8217;s code in it&#8217;s entirety, if you are familiar with tkInter at all it should be pretty simple, if you have any questions ask them and I will try to answer them:</p>
<div class="hl-surround" style="height:280px;"><div class="hl-main"><pre><span class="hl-reserved">class </span><span class="hl-identifier">RSSItemDialog</span><span class="hl-brackets">(</span><span class="hl-identifier">tkSimpleDialog</span><span class="hl-code">.</span><span class="hl-identifier">Dialog</span><span class="hl-brackets">)</span><span class="hl-default">:

    </span><span class="hl-reserved">def </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">parent</span><span class="hl-code">, </span><span class="hl-identifier">title</span><span class="hl-code">=</span><span class="hl-reserved">None</span><span class="hl-code">, </span><span class="hl-identifier">RSSName</span><span class="hl-code">=</span><span class="hl-quotes">&quot;&quot;</span><span class="hl-code">, </span><span class="hl-identifier">RSSUrl</span><span class="hl-code">=</span><span class="hl-quotes">&quot;&quot;</span><span class="hl-brackets">)</span><span class="hl-default">:
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Init, override default for default params</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">RSSName</span><span class="hl-default"> = </span><span class="hl-identifier">RSSName
        self</span><span class="hl-default">.</span><span class="hl-identifier">RSSUrl</span><span class="hl-default"> = </span><span class="hl-identifier">RSSUrl
        self</span><span class="hl-default">.</span><span class="hl-identifier">Result</span><span class="hl-default"> = </span><span class="hl-reserved">False </span><span class="hl-comment">#Default = Cancel
        </span><span class="hl-identifier">tkSimpleDialog</span><span class="hl-default">.</span><span class="hl-identifier">Dialog</span><span class="hl-default">.</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">parent</span><span class="hl-code">,</span><span class="hl-identifier">title</span><span class="hl-brackets">)
        
    </span><span class="hl-reserved">def </span><span class="hl-identifier">body</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">master</span><span class="hl-brackets">)</span><span class="hl-default">:
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">This is where you create the Body of the dlg</span><span class="hl-quotes">&quot;&quot;&quot;
 
        </span><span class="hl-identifier">lbText</span><span class="hl-default"> = </span><span class="hl-identifier">Label</span><span class="hl-brackets">(</span><span class="hl-identifier">master</span><span class="hl-code">, </span><span class="hl-identifier">text</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">Name</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)
        </span><span class="hl-identifier">lbText</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">0</span><span class="hl-code">, </span><span class="hl-identifier">padx</span><span class="hl-code">=</span><span class="hl-number">5</span><span class="hl-code">, </span><span class="hl-identifier">pady</span><span class="hl-code">=</span><span class="hl-number">10</span><span class="hl-code">,</span><span class="hl-identifier">sticky</span><span class="hl-code">=</span><span class="hl-identifier">W</span><span class="hl-brackets">)
        </span><span class="hl-identifier">lbText</span><span class="hl-default"> = </span><span class="hl-identifier">Label</span><span class="hl-brackets">(</span><span class="hl-identifier">master</span><span class="hl-code">, </span><span class="hl-identifier">text</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">URL:</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)
        </span><span class="hl-identifier">lbText</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">1</span><span class="hl-code">, </span><span class="hl-identifier">padx</span><span class="hl-code">=</span><span class="hl-number">5</span><span class="hl-code">,</span><span class="hl-identifier">sticky</span><span class="hl-code">=</span><span class="hl-identifier">W</span><span class="hl-brackets">)

        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">eRSSName</span><span class="hl-default"> = </span><span class="hl-identifier">Entry</span><span class="hl-brackets">(</span><span class="hl-identifier">master</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">eRSSName</span><span class="hl-default">.</span><span class="hl-identifier">insert</span><span class="hl-brackets">(</span><span class="hl-number">0</span><span class="hl-code">,</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">RSSName</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">eRSSUrl</span><span class="hl-default"> = </span><span class="hl-identifier">Entry</span><span class="hl-brackets">(</span><span class="hl-identifier">master</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">eRSSUrl</span><span class="hl-default">.</span><span class="hl-identifier">insert</span><span class="hl-brackets">(</span><span class="hl-number">0</span><span class="hl-code">,</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">RSSUrl</span><span class="hl-brackets">)

        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">eRSSName</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">0</span><span class="hl-code">, </span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">1</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">eRSSUrl</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">1</span><span class="hl-code">, </span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">1</span><span class="hl-brackets">)
        
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Return the widget that will get focus</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-reserved">return </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">eRSSName

    </span><span class="hl-reserved">def </span><span class="hl-builtin">apply</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">&quot;&quot;&quot;</span><span class="hl-string">They have selected OK</span><span class="hl-quotes">&quot;&quot;&quot;
        </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-reserved">True
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">RSSName</span><span class="hl-default"> = </span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">eRSSName</span><span class="hl-code">.</span><span class="hl-identifier">get</span><span class="hl-brackets">())
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">RSSUrl</span><span class="hl-default"> = </span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">eRSSUrl</span><span class="hl-code">.</span><span class="hl-identifier">get</span><span class="hl-brackets">())</span></pre></div></div>
<p><a href="http://www.learningpython.com/images/RSSDialog.png"><img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://www.learningpython.com/images/small_RSSDialog.png" alt="Python Dialog" border="0" /></a></p>
<p>Now we need to do a few things, we need to save a list of RSS sites in our GUIFramework class, this will correspond to the list of items in the Listbox. To do so we add the following code to the __init__ function:</p>
<div class="hl-surround" style="height:28px;"><div class="hl-main"><pre><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lstSites</span><span class="hl-default"> = </span><span class="hl-brackets">[]</span></pre></div></div>
<p>This is a list of RSS sites that the user has added to our application.  We will also need a new class to contain all of the RSSSite information, the class is pretty simple:</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-reserved">class </span><span class="hl-identifier">RSSSite</span><span class="hl-default">:
    </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">An RSS Site</span><span class="hl-quotes">&quot;&quot;&quot;
    </span><span class="hl-reserved">def </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">Name</span><span class="hl-code">=</span><span class="hl-quotes">&quot;&quot;</span><span class="hl-code">, </span><span class="hl-identifier">Url</span><span class="hl-code">=</span><span class="hl-quotes">&quot;&quot;</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">Name</span><span class="hl-default"> = </span><span class="hl-identifier">Name
        self</span><span class="hl-default">.</span><span class="hl-identifier">Url</span><span class="hl-default"> = </span><span class="hl-identifier">Url</span></pre></div></div>
<p>Then we have to create a function that will correspond to when the Add button is pressed.  This dialog will show the RSSItemDialog and then if Ok is press add the resulting RSSSite to the RSS Site Listbox (<em>lbSites</em>) and store the site in the <em>lstSites</em> list.  The code to accomplish this is as follows:</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-reserved">def </span><span class="hl-identifier">AddRSSItem</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">&quot;&quot;&quot;</span><span class="hl-string">Add an RSSItem</span><span class="hl-quotes">&quot;&quot;&quot;
    
    </span><span class="hl-identifier">RSSDlg</span><span class="hl-default"> = </span><span class="hl-identifier">RSSItemDialog</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">master</span><span class="hl-code">,</span><span class="hl-quotes">&quot;</span><span class="hl-string">Add new Item</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)
    </span><span class="hl-identifier">if </span><span class="hl-brackets">(</span><span class="hl-identifier">RSSDlg</span><span class="hl-code">.</span><span class="hl-identifier">Result</span><span class="hl-brackets">)</span><span class="hl-default">:
        </span><span class="hl-identifier">newSite</span><span class="hl-default"> = </span><span class="hl-identifier">RSSSite</span><span class="hl-brackets">(</span><span class="hl-identifier">RSSDlg</span><span class="hl-code">.</span><span class="hl-identifier">RSSName</span><span class="hl-code">
                           , </span><span class="hl-identifier">RSSDlg</span><span class="hl-code">.</span><span class="hl-identifier">RSSUrl</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbSites</span><span class="hl-default">.</span><span class="hl-identifier">insert</span><span class="hl-brackets">(</span><span class="hl-identifier">END</span><span class="hl-code">, </span><span class="hl-identifier">RSSDlg</span><span class="hl-code">.</span><span class="hl-identifier">RSSName</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbSites</span><span class="hl-default">.</span><span class="hl-identifier">select_clear</span><span class="hl-brackets">(</span><span class="hl-number">0</span><span class="hl-code">,</span><span class="hl-identifier">END</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbSites</span><span class="hl-default">.</span><span class="hl-identifier">select_set</span><span class="hl-brackets">(</span><span class="hl-identifier">END</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lstSites</span><span class="hl-default">.</span><span class="hl-identifier">append</span><span class="hl-brackets">(</span><span class="hl-identifier">newSite</span><span class="hl-brackets">)</span></pre></div></div>
<p>So we create the new dialog, and then if the user clicks Ok (Result == True) we create a new site.  Then we add the sites name to the end of the lbSites listbox, clear any current selection, and then select what we just added.  After that we simply add the RSS site to our site list.  So the position of the RSS Sites name in the <em>lbSites</em> ListBox corresponds to the RSSSite&#8217;s position in the <em>lstSites</em> list.  It&#8217;s basically like a simple mapping, I would rather store all of the information in the Listbox but I couldn&#8217;t find anyway to do that. </p>
<p>We will use that same basic formula to create the EditRSSItem function, but instead of creating a new RSSSite we need to edit the selected RSSSite:</p>
<div class="hl-surround" style="height:280px;"><div class="hl-main"><pre><span class="hl-reserved">def </span><span class="hl-identifier">EditRSSItem</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">&quot;&quot;&quot;</span><span class="hl-string">Edit an RSSItem</span><span class="hl-quotes">&quot;&quot;&quot;  
    &quot;&quot;&quot;</span><span class="hl-string">Get the Current selection</span><span class="hl-quotes">&quot;&quot;&quot;
    </span><span class="hl-identifier">lstCurrSel</span><span class="hl-default"> = </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbSites</span><span class="hl-default">.</span><span class="hl-identifier">curselection</span><span class="hl-brackets">()</span><span class="hl-default">;
               
    </span><span class="hl-identifier">if </span><span class="hl-brackets">(</span><span class="hl-builtin">len</span><span class="hl-brackets">(</span><span class="hl-identifier">lstCurrSel</span><span class="hl-brackets">)</span><span class="hl-code">&gt;</span><span class="hl-number">0</span><span class="hl-brackets">)</span><span class="hl-default">:
        </span><span class="hl-identifier">selected_site</span><span class="hl-default"> = </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lstSites</span><span class="hl-brackets">[</span><span class="hl-builtin">int</span><span class="hl-brackets">(</span><span class="hl-identifier">lstCurrSel</span><span class="hl-brackets">[</span><span class="hl-number">0</span><span class="hl-brackets">])]
        </span><span class="hl-identifier">RSSDlg</span><span class="hl-default"> = </span><span class="hl-identifier">RSSItemDialog</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">
                                ,</span><span class="hl-quotes">&quot;</span><span class="hl-string">Edit</span><span class="hl-quotes">&quot;</span><span class="hl-code">
                                , </span><span class="hl-identifier">selected_site</span><span class="hl-code">.</span><span class="hl-identifier">Name</span><span class="hl-code">
                                , </span><span class="hl-identifier">selected_site</span><span class="hl-code">.</span><span class="hl-identifier">Url</span><span class="hl-brackets">)
        </span><span class="hl-identifier">if </span><span class="hl-brackets">(</span><span class="hl-identifier">RSSDlg</span><span class="hl-code">.</span><span class="hl-identifier">Result</span><span class="hl-brackets">)</span><span class="hl-default">:
            </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Update the ListBox</span><span class="hl-quotes">&quot;&quot;&quot;
            </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbSites</span><span class="hl-default">.</span><span class="hl-identifier">delete</span><span class="hl-brackets">(</span><span class="hl-identifier">lstCurrSel</span><span class="hl-brackets">)
            </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbSites</span><span class="hl-default">.</span><span class="hl-identifier">insert</span><span class="hl-brackets">(</span><span class="hl-identifier">lstCurrSel</span><span class="hl-code">, </span><span class="hl-identifier">RSSDlg</span><span class="hl-code">.</span><span class="hl-identifier">RSSName</span><span class="hl-brackets">)
            </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbSites</span><span class="hl-default">.</span><span class="hl-identifier">select_clear</span><span class="hl-brackets">(</span><span class="hl-number">0</span><span class="hl-code">,</span><span class="hl-identifier">END</span><span class="hl-brackets">)
            </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbSites</span><span class="hl-default">.</span><span class="hl-identifier">select_set</span><span class="hl-brackets">(</span><span class="hl-identifier">lstCurrSel</span><span class="hl-brackets">)
            
            </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Save the values in the list</span><span class="hl-quotes">&quot;&quot;&quot;
            </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lstSites</span><span class="hl-brackets">[</span><span class="hl-builtin">int</span><span class="hl-brackets">(</span><span class="hl-identifier">lstCurrSel</span><span class="hl-brackets">[</span><span class="hl-number">0</span><span class="hl-brackets">])]</span><span class="hl-default"> =  </span><span class="hl-identifier">RSSSite</span><span class="hl-brackets">(</span><span class="hl-identifier">RSSDlg</span><span class="hl-code">.</span><span class="hl-identifier">RSSName</span><span class="hl-code">
                           , </span><span class="hl-identifier">RSSDlg</span><span class="hl-code">.</span><span class="hl-identifier">RSSUrl</span><span class="hl-brackets">)</span></pre></div></div>
<p>The only confusing code that you might see is this <em>int(lstCurrSel[0])</em>, which is basically converting the first value in the selection list to an integer.  We need to do this because list in python expect integers for indices.  So we get the current selected index in the ListBox and then use that to get the RSSSite from our list.  Then the rest of the process is almost identical to the AddRSSItem function.</p>
<p>Now we need to hook the two functions up to our buttons:</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">btnAdd</span><span class="hl-default"> = </span><span class="hl-identifier">Button</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">text</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">Add</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-identifier">command</span><span class="hl-code">=</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">AddRSSItem</span><span class="hl-brackets">)
</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">btnEdit</span><span class="hl-default"> = </span><span class="hl-identifier">Button</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">text</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">Edit</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-identifier">command</span><span class="hl-code">=</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">EditRSSItem</span><span class="hl-brackets">)</span></pre></div></div>
<p>You can probably guess what the next step in the equation is, we need to make it so that our View button displays all of the RSS items in the <em>lbRSSItems</em> ListBox.  To do this we are going to need to bring in the RSSGenerator.py code that we created in part three.  Instead of taking all the code from that file and then adding it to our current file (which we could do) we are simple going to move that file into the same directory as our current python file (mine is called GUI.py) then we have to import or include the RSSGenerator.py classes:</p>
<div class="hl-surround" style="height:28px;"><div class="hl-main"><pre><span class="hl-reserved">from </span><span class="hl-identifier">RSSGenerator </span><span class="hl-reserved">import</span><span class="hl-default"> *</span></pre></div></div>
<p>Then we have to create a ViewRSSItems function, which is very similar to our EditRSSItem function except that it will fill the <em>lbRSSItems</em> ListBox with all of the current RSS items available on the feed:</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-reserved">def </span><span class="hl-identifier">ViewRSSItems</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">&quot;&quot;&quot;</span><span class="hl-string">Get the Current selection</span><span class="hl-quotes">&quot;&quot;&quot;
    </span><span class="hl-identifier">lstCurrSel</span><span class="hl-default"> = </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbSites</span><span class="hl-default">.</span><span class="hl-identifier">curselection</span><span class="hl-brackets">()</span><span class="hl-default">;
               
    </span><span class="hl-identifier">if </span><span class="hl-brackets">(</span><span class="hl-builtin">len</span><span class="hl-brackets">(</span><span class="hl-identifier">lstCurrSel</span><span class="hl-brackets">)</span><span class="hl-code">&gt;</span><span class="hl-number">0</span><span class="hl-brackets">)</span><span class="hl-default">:
        </span><span class="hl-identifier">selected_site</span><span class="hl-default"> = </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lstSites</span><span class="hl-brackets">[</span><span class="hl-builtin">int</span><span class="hl-brackets">(</span><span class="hl-identifier">lstCurrSel</span><span class="hl-brackets">[</span><span class="hl-number">0</span><span class="hl-brackets">])]
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Empty the ListBox</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbRSSItems</span><span class="hl-default">.</span><span class="hl-identifier">delete</span><span class="hl-brackets">(</span><span class="hl-number">0</span><span class="hl-code">, </span><span class="hl-identifier">END</span><span class="hl-brackets">)
        </span><span class="hl-identifier">rss_reader</span><span class="hl-default"> = </span><span class="hl-identifier">RSSReader</span><span class="hl-brackets">(</span><span class="hl-identifier">selected_site</span><span class="hl-code">.</span><span class="hl-identifier">Url</span><span class="hl-brackets">)
        </span><span class="hl-reserved">for </span><span class="hl-identifier">rss_item </span><span class="hl-reserved">in </span><span class="hl-identifier">rss_reader</span><span class="hl-default">.</span><span class="hl-identifier">GetItems</span><span class="hl-brackets">()</span><span class="hl-default">:
            </span><span class="hl-identifier">if </span><span class="hl-brackets">(</span><span class="hl-identifier">rss_item</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">lbRSSItems</span><span class="hl-default">.</span><span class="hl-identifier">insert</span><span class="hl-brackets">(</span><span class="hl-identifier">END</span><span class="hl-code">,</span><span class="hl-identifier">rss_item</span><span class="hl-code">.</span><span class="hl-identifier">title</span><span class="hl-brackets">)
                </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lstItems</span><span class="hl-default">.</span><span class="hl-identifier">append</span><span class="hl-brackets">(</span><span class="hl-identifier">rss_item</span><span class="hl-brackets">)</span></pre></div></div>
<p>So we get the current selection, then we create our RSSReader based upon the RSSSites Url.  Then we loop through the RSSItems adding each to our ListBox and to our list of the items (<em>lstItems</em>) that we have added in out GUIFramework&#8217;s __init__ function:</p>
<div class="hl-surround" style="height:28px;"><div class="hl-main"><pre><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lstItems</span><span class="hl-default"> = </span><span class="hl-brackets">[]</span></pre></div></div>
<p><a href="http://www.learningpython.com/images/RSSReader01.png"><img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://www.learningpython.com/images/small_RSSReader01.png" alt="Python RSS Reader" border="0" /></a></p>
<p>As you can see the RSS Reader is actually starting to take shape, now all we have to do is show the RSS Items description in the text widget when we click the Set Text button.  Given all the ListBox processing that we have done recently  the way that this works should come as no surprise:</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-reserved">def </span><span class="hl-identifier">SetStoryText</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">&quot;&quot;&quot;</span><span class="hl-string">Set the Story text, called form the btnSetText</span><span class="hl-quotes">&quot;&quot;&quot; 
    &quot;&quot;&quot;</span><span class="hl-string">Get the Current selection</span><span class="hl-quotes">&quot;&quot;&quot;
    </span><span class="hl-identifier">lstCurrSel</span><span class="hl-default"> = </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbRSSItems</span><span class="hl-default">.</span><span class="hl-identifier">curselection</span><span class="hl-brackets">()</span><span class="hl-default">;
               
    </span><span class="hl-identifier">if </span><span class="hl-brackets">(</span><span class="hl-builtin">len</span><span class="hl-brackets">(</span><span class="hl-identifier">lstCurrSel</span><span class="hl-brackets">)</span><span class="hl-code">&gt;</span><span class="hl-number">0</span><span class="hl-brackets">)</span><span class="hl-default">:
        </span><span class="hl-identifier">rss_item</span><span class="hl-default"> = </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lstItems</span><span class="hl-brackets">[</span><span class="hl-builtin">int</span><span class="hl-brackets">(</span><span class="hl-identifier">lstCurrSel</span><span class="hl-brackets">[</span><span class="hl-number">0</span><span class="hl-brackets">])]
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Set the Text Widgets text</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">txtItem</span><span class="hl-default">.</span><span class="hl-identifier">config</span><span class="hl-brackets">(</span><span class="hl-identifier">state</span><span class="hl-code">=</span><span class="hl-identifier">NORMAL</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">txtItem</span><span class="hl-default">.</span><span class="hl-identifier">delete</span><span class="hl-brackets">(</span><span class="hl-number">1.0</span><span class="hl-code">,</span><span class="hl-identifier">END</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">txtItem</span><span class="hl-default">.</span><span class="hl-identifier">insert</span><span class="hl-brackets">(</span><span class="hl-identifier">INSERT</span><span class="hl-code">, </span><span class="hl-identifier">rss_item</span><span class="hl-code">.</span><span class="hl-identifier">description</span><span class="hl-code"> + </span><span class="hl-quotes">&quot;</span><span class="hl-special">\r\n\r\n</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">txtItem</span><span class="hl-default">.</span><span class="hl-identifier">insert</span><span class="hl-brackets">(</span><span class="hl-identifier">INSERT</span><span class="hl-code">, </span><span class="hl-identifier">rss_item</span><span class="hl-code">.</span><span class="hl-identifier">link</span><span class="hl-code">, </span><span class="hl-quotes">&quot;</span><span class="hl-string">a</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">txtItem</span><span class="hl-default">.</span><span class="hl-identifier">config</span><span class="hl-brackets">(</span><span class="hl-identifier">state</span><span class="hl-code">=</span><span class="hl-identifier">DISABLED</span><span class="hl-brackets">)</span></pre></div></div>
<p><a href="http://www.learningpython.com/images/RSSReader02.png"><img style="margin: 0pt 10px 10px 0pt; cursor: pointer; float: left" src="http://www.learningpython.com/images/small_RSSReader02.png" alt="Python RSS Reader" border="0" /></a>Whew that&#8217;s a lot of code this time, but none of it is really that new or that difficult if you have been following along with the RSS Reader so far.  You might notice that I have not gone into great detail describing all of the code.  The reason for that is because for the most part I&#8217;ve already gone over the code in detail in a previous post, or the code is sufficiently similar to code I have gone over that I don&#8217;t think that it needs a great deal of description.  But if you have any questions about any of the code that I have shown above feel free to ask a question and I will be happy to explain it in more detail.</p>
<p>The next step in the RSS Read will be to save and load the RSSSites into a file so that we don&#8217;t have to waste our time typing them in every time we start the program, but I&#8217;ll leave that for another day.</p>
<p>You can download all the code used in this post here: <a href="http://www.learningpython.com/sources/RSSPart4.zip">RSSPart4.zip</a></p>
<div style="float:right;margin:0px 0px 0px 0px;"><a href="http://www.google.com/reader/link?url=http://www.learningpython.com/2006/03/05/rss-reader-part-four-integrating-with-the-gui/&title=RSS reader - Part Four - Integrating with the GUI&srcTitle=learning python&srcURL=http://www.learningpython.com"target="_blank" rel=""><img border="0" src="http://www.learningpython.com/wp-content/plugins/wp-google-buzz/icon/12.png" style="opacity:1;filter:alpha(opacity=100)" onmouseover="this.style.opacity=0.8;this.filters.alpha.opacity=70" onmouseout="this.style.opacity=1;this.filters.alpha.opacity=100"/> </a></div>]]></content:encoded>
			<wfw:commentRss>http://www.learningpython.com/2006/03/05/rss-reader-part-four-integrating-with-the-gui/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Creating a GUI in Python using Tkinter &#8211; Part 2</title>
		<link>http://www.learningpython.com/2006/02/19/creating-a-gui-in-python-using-tkinter-part-2/</link>
		<comments>http://www.learningpython.com/2006/02/19/creating-a-gui-in-python-using-tkinter-part-2/#comments</comments>
		<pubDate>Sun, 19 Feb 2006 22:18:40 +0000</pubDate>
		<dc:creator>selsine</dc:creator>
				<category><![CDATA[gui]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[tkinter]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.learningpython.com/?p=16</guid>
		<description><![CDATA[
			
				
			
		
This post is going to build off of Creating a GUI in Python using Tkinter which introduces the basic elements needed to create a GUI using TKinter.  This post will take that introduction a bit further and build a more complex GUI application and use some more widgets.
The GUI that we are going to [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.learningpython.com%2F2006%2F02%2F19%2Fcreating-a-gui-in-python-using-tkinter-part-2%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.learningpython.com%2F2006%2F02%2F19%2Fcreating-a-gui-in-python-using-tkinter-part-2%2F&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>This post is going to build off of <a href="http://www.learningpython.com/2006/02/08/creating-a-gui-in-python-using-tkinter/">Creating a GUI in Python using Tkinter</a> which introduces the basic elements needed to create a GUI using TKinter.  This post will take that introduction a bit further and build a more complex GUI application and use some more widgets.</p>
<p>The GUI that we are going to start creating is the GUI that we will eventually use for the <a href="http://www.learningpython.com/category/python/rss-reader/">RSS reader</a> that I am creating.</p>
<p>Not much having to do with the RSS reader will happen in this post since we will just be creating the GUI shell, but it will help to explain some of the variable names.</p>
<p><img style="margin: 0pt 10px 10px 0pt; float: left;" src="http://www.learningpython.com/images/GUILayout.png" alt="GuiLayout" />We are going to start off with a simple shell that will hopefully resemble the following layout.  We will have RSS sites on the left, then the selected sites RSS story titles on the right, and finally the selected stories text on the bottom.</p>
<p>To create this GUI we will be using the following widgets:</p>
<ul>
<li><a href="http://www.pythonware.com/library/tkinter/introduction/button.htm">Button</a></li>
<li><a href="http://www.pythonware.com/library/tkinter/introduction/listbox.htm">ListBox</a></li>
<li><a href="http://www.pythonware.com/library/tkinter/introduction/scrollbar.htm">ScrollBar</a></li>
<li><a href="http://www.pythonware.com/library/tkinter/introduction/label.htm">Label</a></li>
<li><a href="http://www.pythonware.com/library/tkinter/introduction/text.htm">Text</a></li>
<li><a href="http://www.pythonware.com/library/tkinter/introduction/frame.htm">Frame</a></li>
</ul>
<p><span id="more-16"></span><br />
The first thing that we are going to do is start off with a blank GUIFramework based on what we did on part one:</p>
<div class="hl-surround" style="height:280px;"><div class="hl-main"><pre><span class="hl-comment">#! /usr/bin/env python
</span><span class="hl-reserved">from </span><span class="hl-identifier">Tkinter </span><span class="hl-reserved">import</span><span class="hl-default"> *
</span><span class="hl-reserved">import </span><span class="hl-identifier">tkMessageBox

</span><span class="hl-reserved">class </span><span class="hl-identifier">GUIFramework</span><span class="hl-brackets">(</span><span class="hl-identifier">Frame</span><span class="hl-brackets">)</span><span class="hl-default">:
    </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">This is the GUI</span><span class="hl-quotes">&quot;&quot;&quot;
    
    </span><span class="hl-reserved">def </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">master</span><span class="hl-code">=</span><span class="hl-reserved">None</span><span class="hl-brackets">)</span><span class="hl-default">:
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Initialize yourself</span><span class="hl-quotes">&quot;&quot;&quot;
        
        &quot;&quot;&quot;</span><span class="hl-string">Initialise the base class</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">Frame</span><span class="hl-default">.</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">master</span><span class="hl-brackets">)
        
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Set the Window Title</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">master</span><span class="hl-default">.</span><span class="hl-identifier">title</span><span class="hl-brackets">(</span><span class="hl-quotes">&quot;</span><span class="hl-string">RSS Reader - Eventually</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Display the main window
        with a little bit of padding</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">padx</span><span class="hl-code">=</span><span class="hl-number">15</span><span class="hl-code">, </span><span class="hl-identifier">pady</span><span class="hl-code">=</span><span class="hl-number">15</span><span class="hl-code">,</span><span class="hl-identifier">sticky</span><span class="hl-code">=</span><span class="hl-identifier">N</span><span class="hl-code">+</span><span class="hl-identifier">S</span><span class="hl-code">+</span><span class="hl-identifier">E</span><span class="hl-code">+</span><span class="hl-identifier">W</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">CreateWidgets</span><span class="hl-brackets">()
       
    </span><span class="hl-reserved">def </span><span class="hl-identifier">CreateWidgets</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">&quot;&quot;&quot;</span><span class="hl-string">Create all the widgets that we need</span><span class="hl-quotes">&quot;&quot;&quot;
                
</span><span class="hl-reserved">if </span><span class="hl-identifier">__name__</span><span class="hl-default"> == </span><span class="hl-quotes">&quot;</span><span class="hl-string">__main__</span><span class="hl-quotes">&quot;</span><span class="hl-default">:
    </span><span class="hl-identifier">guiFrame</span><span class="hl-default"> = </span><span class="hl-identifier">GUIFramework</span><span class="hl-brackets">()
    </span><span class="hl-identifier">guiFrame</span><span class="hl-default">.</span><span class="hl-identifier">mainloop</span><span class="hl-brackets">()</span></pre></div></div>
<p>Running this code will simply create a blank window with nothing in it, not very interesting.  So what we need to do is add our first ListBox.  We&#8217;ll also add a label to our listbox so that we know what it is:</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Create the Text</span><span class="hl-quotes">&quot;&quot;&quot;
</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbRSSSiteText</span><span class="hl-default"> = </span><span class="hl-identifier">Label</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">text</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">Select Site:</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)
</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbRSSSiteText</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">0</span><span class="hl-code">, </span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">0</span><span class="hl-code">, </span><span class="hl-identifier">sticky</span><span class="hl-code">=</span><span class="hl-identifier">W</span><span class="hl-brackets">)

</span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Create the ListBox</span><span class="hl-quotes">&quot;&quot;&quot;
</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbSites</span><span class="hl-default"> = </span><span class="hl-identifier">Listbox</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">selectmode</span><span class="hl-code">=</span><span class="hl-identifier">BROWSE</span><span class="hl-code">
                        , </span><span class="hl-identifier">relief</span><span class="hl-code">=</span><span class="hl-identifier">SUNKEN</span><span class="hl-brackets">)
</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbSites</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">1</span><span class="hl-code">, </span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">0</span><span class="hl-brackets">)</span></pre></div></div>
<p><img style="margin: 0pt 10px 10px 0pt; float: left; height: 150px" src="http://www.learningpython.com/images/GUIPT2_01.png" alt="GuiLayout" />You&#8217;ll notice that we are setting a few properties for the ListBox and Label widgets.  The first is that we are making the Label widget sticky to the West (sticky=W) this simply aligns the order to the left of the ListBox.  The other settings are applied to the ListBox and they are: <em>selectmode=BROWSE</em> and <em>relief=SUNKEN </em>.</p>
<p>The selectmode option controls how the user will be able to interact with the ListBox, there are for available options:</p>
<ul>
<li>SINGLE &#8211; The user can select one item</li>
<li>BROWSE &#8211; Just like single, except the user can switch the selection using the mouse</li>
<li>MULTIPLE &#8211; Multiple items can be selected.  The user can select an item by simply clicking on it.</li>
<li>EXTENDED &#8211; Just like multiple, except that in order to select multiple items, the used must use the SHIFT or CTRL button.  If they simply select items using the mouse this setting will function like the BROWSE setting</li>
</ul>
<p>The other setting that we apply is the <em>relief=SUNKEN </em>, this gives the listbox a sunken border, I just think that it looks nice.</p>
<p>Now in order to interact with the RSS Site ListBox we are going to let the user Add, Edit, Remove, and View the sites.  We are going to use buttons in order to let the user perform these tasks.  The code to create the buttons is pretty simple:</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Create the Add, Remove, Edit, and View Buttons</span><span class="hl-quotes">&quot;&quot;&quot;
</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">btnAdd</span><span class="hl-default"> = </span><span class="hl-identifier">Button</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">text</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">Add</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)
</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">btnAdd</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">0</span><span class="hl-code">, </span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">2</span><span class="hl-code">, </span><span class="hl-identifier">stick</span><span class="hl-code">=</span><span class="hl-identifier">E</span><span class="hl-code">, </span><span class="hl-identifier">pady</span><span class="hl-code">=</span><span class="hl-number">5</span><span class="hl-brackets">)
</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">btnRemove</span><span class="hl-default"> = </span><span class="hl-identifier">Button</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">text</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">Remove</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)
</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">btnRemove</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">1</span><span class="hl-code">, </span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">2</span><span class="hl-code">, </span><span class="hl-identifier">stick</span><span class="hl-code">=</span><span class="hl-identifier">E</span><span class="hl-code">, </span><span class="hl-identifier">pady</span><span class="hl-code">=</span><span class="hl-number">5</span><span class="hl-brackets">)
</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">btnEdit</span><span class="hl-default"> = </span><span class="hl-identifier">Button</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">text</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">Edit</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)
</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">btnEdit</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">2</span><span class="hl-code">, </span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">2</span><span class="hl-code">, </span><span class="hl-identifier">stick</span><span class="hl-code">=</span><span class="hl-identifier">E</span><span class="hl-code">, </span><span class="hl-identifier">pady</span><span class="hl-code">=</span><span class="hl-number">5</span><span class="hl-brackets">)
</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">btnView</span><span class="hl-default"> = </span><span class="hl-identifier">Button</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">text</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">View</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)
</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">btnView</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">3</span><span class="hl-code">, </span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">2</span><span class="hl-code">, </span><span class="hl-identifier">stick</span><span class="hl-code">=</span><span class="hl-identifier">E</span><span class="hl-code">, </span><span class="hl-identifier">pady</span><span class="hl-code">=</span><span class="hl-number">5</span><span class="hl-brackets">)</span></pre></div></div>
<p>We also have to make a few changes to the way that the ListBox displays itself:</p>
<div class="hl-surround" style="height:28px;"><div class="hl-main"><pre><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbSites</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">1</span><span class="hl-code">, </span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">0</span><span class="hl-code">, </span><span class="hl-identifier">columnspan</span><span class="hl-code">=</span><span class="hl-number">4</span><span class="hl-code">, </span><span class="hl-identifier">sticky</span><span class="hl-code">=</span><span class="hl-identifier">N</span><span class="hl-code">+</span><span class="hl-identifier">W</span><span class="hl-code">+</span><span class="hl-identifier">S</span><span class="hl-code">+</span><span class="hl-identifier">E</span><span class="hl-brackets">)</span></pre></div></div>
<p>The columnspan=4 setting just makes the ListBox span 4 columns so that it is in line with the four buttons that will interact with it.  The sticky=N+W+S+E makes the ListBox fill the entire grid container instead of being centered in the middle.</p>
<p>I also added a little bit code to populate the ListBox with 40 numbers so that we can play with it a bit more:</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Just fill up the listbox with some numbers</span><span class="hl-quotes">&quot;&quot;&quot;
</span><span class="hl-reserved">for </span><span class="hl-identifier">i </span><span class="hl-reserved">in </span><span class="hl-builtin">range</span><span class="hl-brackets">(</span><span class="hl-number">40</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">lbSites</span><span class="hl-default">.</span><span class="hl-identifier">insert</span><span class="hl-brackets">(</span><span class="hl-identifier">END</span><span class="hl-code">, </span><span class="hl-identifier">i</span><span class="hl-brackets">)</span></pre></div></div>
<p><img style="margin: 0pt 10px 10px 0pt; float: left;height: 150px;" src="http://www.learningpython.com/images/GUIPT2_02.png" alt="GuiLayout" />Now that&#8217;s starting to look a little better but why don&#8217;t we have any scrollbars on the ListBox?  We can scroll it but there are no scroll-bars?   The interesting thing about TKinter is that widgets like the ListBox are scrollable by default, but they do not display a scrollbar unless you create one yourself.  So in order to have a fully functioning GUI application we are going to start having to add some ScrollBar widgets.</p>
<p>So right before we create the ListBox we need to create the scrollbars that we will use, this code is pretty self explanatory, the only interesting portion is that we do not make the scrollbars members of self.  The reason for that is that for right now we won&#8217;t be interacting with them at all:</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-identifier">scrollbarV</span><span class="hl-default"> = </span><span class="hl-identifier">Scrollbar</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">orient</span><span class="hl-code">=</span><span class="hl-identifier">VERTICAL</span><span class="hl-brackets">)
</span><span class="hl-identifier">scrollbarH</span><span class="hl-default"> = </span><span class="hl-identifier">Scrollbar</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">orient</span><span class="hl-code">=</span><span class="hl-identifier">HORIZONTAL</span><span class="hl-brackets">)</span></pre></div></div>
<p>Then when we create the ListBox we need to tell it that scrollbarV and scrollbarH will be  used to control the scrolling:</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbSites</span><span class="hl-default"> = </span><span class="hl-identifier">Listbox</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">selectmode</span><span class="hl-code">=</span><span class="hl-identifier">BROWSE</span><span class="hl-code">
                        , </span><span class="hl-identifier">yscrollcommand</span><span class="hl-code">=</span><span class="hl-identifier">scrollbarV</span><span class="hl-code">.</span><span class="hl-identifier">set</span><span class="hl-code">
                        , </span><span class="hl-identifier">xscrollcommand</span><span class="hl-code">=</span><span class="hl-identifier">scrollbarH</span><span class="hl-code">.</span><span class="hl-identifier">set</span><span class="hl-code">
                        , </span><span class="hl-identifier">relief</span><span class="hl-code">=</span><span class="hl-identifier">SUNKEN</span><span class="hl-brackets">)</span></pre></div></div>
<p>The yscrollcommand=scrollbarV.set connects the yscrollcommand callback (fired when the ListBox is scrolled in the vertical direction) with the scrollbarV.set method.  So when we scroll the ListBox, the scrollbar will follow.</p>
<p>The next thing we need to do is make the connection in the reverse, make it so that when the scrollbar is scrolled the ListBox follows.  We also have to display the ScrollBars in the correct grid positions, namely the positions directly to the right and bottom of the ListBox.  Doing this means that we will also have to move the Buttons down one more row to row 3.  We also have to make the horizontal ScrollBar span 4 columns so that it is always aligned with the ListBox.</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-identifier">scrollbarV</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">1</span><span class="hl-code">, </span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">4</span><span class="hl-code">, </span><span class="hl-identifier">sticky</span><span class="hl-code">=</span><span class="hl-identifier">N</span><span class="hl-code">+</span><span class="hl-identifier">S</span><span class="hl-brackets">)
</span><span class="hl-identifier">scrollbarV</span><span class="hl-default">.</span><span class="hl-identifier">config</span><span class="hl-brackets">(</span><span class="hl-identifier">command</span><span class="hl-code">=</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">lbSites</span><span class="hl-code">.</span><span class="hl-identifier">yview</span><span class="hl-brackets">)
</span><span class="hl-identifier">scrollbarH</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">2</span><span class="hl-code">, </span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">0</span><span class="hl-code">, </span><span class="hl-identifier">columnspan</span><span class="hl-code">=</span><span class="hl-number">4</span><span class="hl-code">, </span><span class="hl-identifier">sticky</span><span class="hl-code">=</span><span class="hl-identifier">E</span><span class="hl-code">+</span><span class="hl-identifier">W</span><span class="hl-brackets">)
</span><span class="hl-identifier">scrollbarH</span><span class="hl-default">.</span><span class="hl-identifier">config</span><span class="hl-brackets">(</span><span class="hl-identifier">command</span><span class="hl-code">=</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">lbSites</span><span class="hl-code">.</span><span class="hl-identifier">xview</span><span class="hl-brackets">)</span></pre></div></div>
<p><img style="margin: 0pt 10px 10px 0pt; float: left;height: 150px;" src="http://www.learningpython.com/images/GUIPT2_03.png" alt="GuiLayout" />Now we have two functioning scrollbars, the horizontal one doesn&#8217;t do much since none of the numbers are long enough, but you can see that the vertical one is working properly.</p>
<p>So the next thing to do is add the next ListBox, I won&#8217;t go over this code since it&#8217;s basically a duplication of the above code.  The only thing I will point out is that when you look at the final code you&#8217;ll see that I added a Frame widget between the two ListBox Widgets, this is to simple add some space between them.  I also added a Read button under the second ListBox.</p>
<p><img style="margin: 0pt 10px 10px 0pt" src="http://www.learningpython.com/images/GUIPT2_04.png" alt="GuiLayout" /></p>
<p>Now we need to add the Text Widget below the buttons, the code should feel familiar to you now that you are used to adding scrollbars to items, the only difference are a few of the text settings:</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Create the Text Widget</span><span class="hl-quotes">&quot;&quot;&quot;
</span><span class="hl-identifier">scrollbarV</span><span class="hl-default"> = </span><span class="hl-identifier">Scrollbar</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">orient</span><span class="hl-code">=</span><span class="hl-identifier">VERTICAL</span><span class="hl-brackets">)
</span><span class="hl-identifier">scrollbarH</span><span class="hl-default"> = </span><span class="hl-identifier">Scrollbar</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">orient</span><span class="hl-code">=</span><span class="hl-identifier">HORIZONTAL</span><span class="hl-brackets">)
</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">txtItem</span><span class="hl-default"> = </span><span class="hl-identifier">Text</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">wrap</span><span class="hl-code">=</span><span class="hl-identifier">WORD</span><span class="hl-code">
                     , </span><span class="hl-identifier">yscrollcommand</span><span class="hl-code">=</span><span class="hl-identifier">scrollbarV</span><span class="hl-code">.</span><span class="hl-identifier">set</span><span class="hl-code">
                     , </span><span class="hl-identifier">xscrollcommand</span><span class="hl-code">=</span><span class="hl-identifier">scrollbarH</span><span class="hl-code">.</span><span class="hl-identifier">set</span><span class="hl-code">
                     , </span><span class="hl-identifier">relief</span><span class="hl-code">=</span><span class="hl-identifier">SUNKEN</span><span class="hl-code">
                     , </span><span class="hl-identifier">takefocus</span><span class="hl-code">=</span><span class="hl-number">0</span><span class="hl-code">
                     , </span><span class="hl-identifier">borderwidth</span><span class="hl-code">=</span><span class="hl-number">1</span><span class="hl-code">
                     , </span><span class="hl-identifier">state</span><span class="hl-code">=</span><span class="hl-identifier">NORMAL</span><span class="hl-code">
                     , </span><span class="hl-identifier">cursor</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">arrow</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)                    
</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">txtItem</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">5</span><span class="hl-code">, </span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">0</span><span class="hl-code">
                   , </span><span class="hl-identifier">columnspan</span><span class="hl-code">=</span><span class="hl-number">7</span><span class="hl-code">, </span><span class="hl-identifier">sticky</span><span class="hl-code">=</span><span class="hl-identifier">N</span><span class="hl-code">+</span><span class="hl-identifier">W</span><span class="hl-code">+</span><span class="hl-identifier">S</span><span class="hl-code">+</span><span class="hl-identifier">E</span><span class="hl-brackets">)
</span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Show the scrollbars and attach them</span><span class="hl-quotes">&quot;&quot;&quot;
</span><span class="hl-identifier">scrollbarV</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">5</span><span class="hl-code">, </span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">7</span><span class="hl-code">, </span><span class="hl-identifier">sticky</span><span class="hl-code">=</span><span class="hl-identifier">N</span><span class="hl-code">+</span><span class="hl-identifier">S</span><span class="hl-brackets">)
</span><span class="hl-identifier">scrollbarV</span><span class="hl-default">.</span><span class="hl-identifier">config</span><span class="hl-brackets">(</span><span class="hl-identifier">command</span><span class="hl-code">=</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">txtItem</span><span class="hl-code">.</span><span class="hl-identifier">yview</span><span class="hl-brackets">)
</span><span class="hl-identifier">scrollbarH</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">6</span><span class="hl-code">, </span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">0</span><span class="hl-code">, </span><span class="hl-identifier">columnspan</span><span class="hl-code">=</span><span class="hl-number">7</span><span class="hl-code">, </span><span class="hl-identifier">sticky</span><span class="hl-code">=</span><span class="hl-identifier">E</span><span class="hl-code">+</span><span class="hl-identifier">W</span><span class="hl-brackets">)
</span><span class="hl-identifier">scrollbarH</span><span class="hl-default">.</span><span class="hl-identifier">config</span><span class="hl-brackets">(</span><span class="hl-identifier">command</span><span class="hl-code">=</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">txtItem</span><span class="hl-code">.</span><span class="hl-identifier">xview</span><span class="hl-brackets">)</span></pre></div></div>
<p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.learningpython.com/images/GUIPT2_05.png"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://www.learningpython.com/images/small_GUIPT2_05.png" alt="" border="0" /></a>You&#8217;ll notice that we set the Text widgets cursor to be an arrow, we do this because the Text isn&#8217;t supposed to be editable, it&#8217;s read-only.  If we don&#8217;t set the cursor the Text widget will use the default &#8220;i-beam&#8221; or text-editor cursor.</p>
<p>The <em>takefocus=0</em> settings tells the Text widget not to take the focus, or allow the user to tab to the Text widget.</p>
<p>So that&#8217;s about it for this this GUI, it&#8217;s pretty simple when you look at each part one by one, but creating a large GUI does get to be a bit complicated when having to pay attention to the grid positions and scrollbars.  Here is the full code of the GUI, you&#8217;ll notice that there are a few additions to the code, like the resizing and some functions, but I&#8217;ll let you try to figure out how those work.  If you have any questions or comments feel free to post them.</p>
<p>Download the code as a text file <a href="http://www.learningpython.com/sources/Gui_pt2.txt">here</a>.</p>
<p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.learningpython.com/images/GUIPT2_06.png"><img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://www.learningpython.com/images/small_GUIPT2_06.png" alt="" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.learningpython.com/images/GUIPT2_07.png"><img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://www.learningpython.com/images/small_GUIPT2_07.png" alt="" border="0" /></a></p>
<div class="hl-surround" style="height:280px;"><div class="hl-main"><pre><span class="hl-comment">#! /usr/bin/env python
</span><span class="hl-reserved">from </span><span class="hl-identifier">Tkinter </span><span class="hl-reserved">import</span><span class="hl-default"> *
</span><span class="hl-reserved">import </span><span class="hl-identifier">tkMessageBox

</span><span class="hl-reserved">class </span><span class="hl-identifier">GUIFramework</span><span class="hl-brackets">(</span><span class="hl-identifier">Frame</span><span class="hl-brackets">)</span><span class="hl-default">:
    </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">This is the GUI</span><span class="hl-quotes">&quot;&quot;&quot;
    
    </span><span class="hl-reserved">def </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">master</span><span class="hl-code">=</span><span class="hl-reserved">None</span><span class="hl-brackets">)</span><span class="hl-default">:
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Initialize yourself</span><span class="hl-quotes">&quot;&quot;&quot;
        
        &quot;&quot;&quot;</span><span class="hl-string">Initialise the base class</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">Frame</span><span class="hl-default">.</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">master</span><span class="hl-brackets">)
        
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Set the Window Title</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">master</span><span class="hl-default">.</span><span class="hl-identifier">title</span><span class="hl-brackets">(</span><span class="hl-quotes">&quot;</span><span class="hl-string">RSS Reader - Eventually</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)
        </span><span class="hl-identifier">top</span><span class="hl-default">=</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">winfo_toplevel</span><span class="hl-brackets">()
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Display the main window&quot;
        with a little bit of padding</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">padx</span><span class="hl-code">=</span><span class="hl-number">15</span><span class="hl-code">, </span><span class="hl-identifier">pady</span><span class="hl-code">=</span><span class="hl-number">15</span><span class="hl-code">,</span><span class="hl-identifier">sticky</span><span class="hl-code">=</span><span class="hl-identifier">N</span><span class="hl-code">+</span><span class="hl-identifier">S</span><span class="hl-code">+</span><span class="hl-identifier">E</span><span class="hl-code">+</span><span class="hl-identifier">W</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">InitResizing</span><span class="hl-brackets">()
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">CreateWidgets</span><span class="hl-brackets">()
        
    </span><span class="hl-reserved">def </span><span class="hl-identifier">InitResizing</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">&quot;&quot;&quot;</span><span class="hl-string">Initialize the Resizing of the Window</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">top</span><span class="hl-default">=</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">winfo_toplevel</span><span class="hl-brackets">()
        </span><span class="hl-identifier">top</span><span class="hl-default">.</span><span class="hl-identifier">rowconfigure</span><span class="hl-brackets">(</span><span class="hl-number">0</span><span class="hl-code">, </span><span class="hl-identifier">weight</span><span class="hl-code">=</span><span class="hl-number">1</span><span class="hl-brackets">)
        </span><span class="hl-identifier">top</span><span class="hl-default">.</span><span class="hl-identifier">columnconfigure</span><span class="hl-brackets">(</span><span class="hl-number">0</span><span class="hl-code">, </span><span class="hl-identifier">weight</span><span class="hl-code">=</span><span class="hl-number">1</span><span class="hl-brackets">)
        </span><span class="hl-identifier">top</span><span class="hl-default">.</span><span class="hl-identifier">columnconfigure</span><span class="hl-brackets">(</span><span class="hl-number">0</span><span class="hl-code">, </span><span class="hl-identifier">weight</span><span class="hl-code">=</span><span class="hl-number">1</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">rowconfigure</span><span class="hl-brackets">(</span><span class="hl-number">1</span><span class="hl-code">, </span><span class="hl-identifier">weight</span><span class="hl-code">=</span><span class="hl-number">1</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">columnconfigure</span><span class="hl-brackets">(</span><span class="hl-number">0</span><span class="hl-code">, </span><span class="hl-identifier">weight</span><span class="hl-code">=</span><span class="hl-number">1</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">columnconfigure</span><span class="hl-brackets">(</span><span class="hl-number">6</span><span class="hl-code">, </span><span class="hl-identifier">weight</span><span class="hl-code">=</span><span class="hl-number">1</span><span class="hl-brackets">)
       
    </span><span class="hl-reserved">def </span><span class="hl-identifier">CreateWidgets</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">&quot;&quot;&quot;</span><span class="hl-string">Create all the widgests that we need</span><span class="hl-quotes">&quot;&quot;&quot;
                       
        &quot;&quot;&quot;</span><span class="hl-string">Create the Text</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbRSSSiteText</span><span class="hl-default"> = </span><span class="hl-identifier">Label</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">text</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">Select Site:</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbRSSSiteText</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">0</span><span class="hl-code">, </span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">0</span><span class="hl-code">, </span><span class="hl-identifier">sticky</span><span class="hl-code">=</span><span class="hl-identifier">W</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbRSSItemText</span><span class="hl-default"> = </span><span class="hl-identifier">Label</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">text</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">Select RSS Item:</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbRSSItemText</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">0</span><span class="hl-code">, </span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">6</span><span class="hl-code">, </span><span class="hl-identifier">sticky</span><span class="hl-code">=</span><span class="hl-identifier">W</span><span class="hl-brackets">)
        
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Create the First ListBox</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">scrollbarV</span><span class="hl-default"> = </span><span class="hl-identifier">Scrollbar</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">orient</span><span class="hl-code">=</span><span class="hl-identifier">VERTICAL</span><span class="hl-brackets">)
        </span><span class="hl-identifier">scrollbarH</span><span class="hl-default"> = </span><span class="hl-identifier">Scrollbar</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">orient</span><span class="hl-code">=</span><span class="hl-identifier">HORIZONTAL</span><span class="hl-brackets">)
        
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbSites</span><span class="hl-default"> = </span><span class="hl-identifier">Listbox</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">selectmode</span><span class="hl-code">=</span><span class="hl-identifier">BROWSE</span><span class="hl-code">
                                , </span><span class="hl-identifier">yscrollcommand</span><span class="hl-code">=</span><span class="hl-identifier">scrollbarV</span><span class="hl-code">.</span><span class="hl-identifier">set</span><span class="hl-code">
                                , </span><span class="hl-identifier">xscrollcommand</span><span class="hl-code">=</span><span class="hl-identifier">scrollbarH</span><span class="hl-code">.</span><span class="hl-identifier">set</span><span class="hl-code">
                                , </span><span class="hl-identifier">relief</span><span class="hl-code">=</span><span class="hl-identifier">SUNKEN</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbSites</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">1</span><span class="hl-code">, </span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">0</span><span class="hl-code">, </span><span class="hl-identifier">columnspan</span><span class="hl-code">=</span><span class="hl-number">4</span><span class="hl-code">, </span><span class="hl-identifier">sticky</span><span class="hl-code">=</span><span class="hl-identifier">N</span><span class="hl-code">+</span><span class="hl-identifier">W</span><span class="hl-code">+</span><span class="hl-identifier">S</span><span class="hl-code">+</span><span class="hl-identifier">E</span><span class="hl-brackets">)
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Show the scrollbars and attatch them</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">scrollbarV</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">1</span><span class="hl-code">, </span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">4</span><span class="hl-code">, </span><span class="hl-identifier">sticky</span><span class="hl-code">=</span><span class="hl-identifier">N</span><span class="hl-code">+</span><span class="hl-identifier">S</span><span class="hl-brackets">)
        </span><span class="hl-identifier">scrollbarV</span><span class="hl-default">.</span><span class="hl-identifier">config</span><span class="hl-brackets">(</span><span class="hl-identifier">command</span><span class="hl-code">=</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">lbSites</span><span class="hl-code">.</span><span class="hl-identifier">yview</span><span class="hl-brackets">)
        </span><span class="hl-identifier">scrollbarH</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">2</span><span class="hl-code">, </span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">0</span><span class="hl-code">, </span><span class="hl-identifier">columnspan</span><span class="hl-code">=</span><span class="hl-number">4</span><span class="hl-code">, </span><span class="hl-identifier">sticky</span><span class="hl-code">=</span><span class="hl-identifier">E</span><span class="hl-code">+</span><span class="hl-identifier">W</span><span class="hl-brackets">)
        </span><span class="hl-identifier">scrollbarH</span><span class="hl-default">.</span><span class="hl-identifier">config</span><span class="hl-brackets">(</span><span class="hl-identifier">command</span><span class="hl-code">=</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">lbSites</span><span class="hl-code">.</span><span class="hl-identifier">xview</span><span class="hl-brackets">)
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Set the command</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbSites</span><span class="hl-default">.</span><span class="hl-identifier">bind</span><span class="hl-brackets">(</span><span class="hl-quotes">&quot;</span><span class="hl-string">&lt;double -Button-1&gt;</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">DblCLickSites</span><span class="hl-brackets">)
        
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Create the Add, Remove, Edit, and View Buttons</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">btnAdd</span><span class="hl-default"> = </span><span class="hl-identifier">Button</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">text</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">Add</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-identifier">command</span><span class="hl-code">=</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">Display</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">btnAdd</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">0</span><span class="hl-code">, </span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">3</span><span class="hl-code">, </span><span class="hl-identifier">stick</span><span class="hl-code">=</span><span class="hl-identifier">E</span><span class="hl-code">, </span><span class="hl-identifier">pady</span><span class="hl-code">=</span><span class="hl-number">5</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">btnRemove</span><span class="hl-default"> = </span><span class="hl-identifier">Button</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">text</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">Remove</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-identifier">command</span><span class="hl-code">=</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">Display</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">btnRemove</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">1</span><span class="hl-code">, </span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">3</span><span class="hl-code">, </span><span class="hl-identifier">stick</span><span class="hl-code">=</span><span class="hl-identifier">E</span><span class="hl-code">, </span><span class="hl-identifier">pady</span><span class="hl-code">=</span><span class="hl-number">5</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">btnEdit</span><span class="hl-default"> = </span><span class="hl-identifier">Button</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">text</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">Edit</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-identifier">command</span><span class="hl-code">=</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">Display</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">btnEdit</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">2</span><span class="hl-code">, </span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">3</span><span class="hl-code">, </span><span class="hl-identifier">stick</span><span class="hl-code">=</span><span class="hl-identifier">E</span><span class="hl-code">, </span><span class="hl-identifier">pady</span><span class="hl-code">=</span><span class="hl-number">5</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">btnView</span><span class="hl-default"> = </span><span class="hl-identifier">Button</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">text</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">View</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-identifier">command</span><span class="hl-code">=</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">Display</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">btnView</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">3</span><span class="hl-code">, </span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">3</span><span class="hl-code">, </span><span class="hl-identifier">stick</span><span class="hl-code">=</span><span class="hl-identifier">E</span><span class="hl-code">, </span><span class="hl-identifier">pady</span><span class="hl-code">=</span><span class="hl-number">5</span><span class="hl-brackets">)
        
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Create a frame for space between the two items</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">spaceframe</span><span class="hl-default"> = </span><span class="hl-identifier">Frame</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">width</span><span class="hl-code">=</span><span class="hl-number">15</span><span class="hl-brackets">)
        </span><span class="hl-identifier">spaceframe</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">3</span><span class="hl-code">,</span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">5</span><span class="hl-brackets">)
        
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Create the Second ListBox</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">scrollbarV</span><span class="hl-default"> = </span><span class="hl-identifier">Scrollbar</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">orient</span><span class="hl-code">=</span><span class="hl-identifier">VERTICAL</span><span class="hl-brackets">)
        </span><span class="hl-identifier">scrollbarH</span><span class="hl-default"> = </span><span class="hl-identifier">Scrollbar</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">orient</span><span class="hl-code">=</span><span class="hl-identifier">HORIZONTAL</span><span class="hl-brackets">)
        
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbRSSItems</span><span class="hl-default"> = </span><span class="hl-identifier">Listbox</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">selectmode</span><span class="hl-code">=</span><span class="hl-identifier">BROWSE</span><span class="hl-code">
                                , </span><span class="hl-identifier">yscrollcommand</span><span class="hl-code">=</span><span class="hl-identifier">scrollbarV</span><span class="hl-code">.</span><span class="hl-identifier">set</span><span class="hl-code">
                                , </span><span class="hl-identifier">xscrollcommand</span><span class="hl-code">=</span><span class="hl-identifier">scrollbarH</span><span class="hl-code">.</span><span class="hl-identifier">set</span><span class="hl-code">
                                , </span><span class="hl-identifier">relief</span><span class="hl-code">=</span><span class="hl-identifier">SUNKEN</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbRSSItems</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">1</span><span class="hl-code">, </span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">6</span><span class="hl-code">, </span><span class="hl-identifier">sticky</span><span class="hl-code">=</span><span class="hl-identifier">N</span><span class="hl-code">+</span><span class="hl-identifier">W</span><span class="hl-code">+</span><span class="hl-identifier">S</span><span class="hl-code">+</span><span class="hl-identifier">E</span><span class="hl-brackets">)
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Show the scrollbars and attatch them</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">scrollbarV</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">1</span><span class="hl-code">, </span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">7</span><span class="hl-code">, </span><span class="hl-identifier">sticky</span><span class="hl-code">=</span><span class="hl-identifier">N</span><span class="hl-code">+</span><span class="hl-identifier">S</span><span class="hl-brackets">)
        </span><span class="hl-identifier">scrollbarV</span><span class="hl-default">.</span><span class="hl-identifier">config</span><span class="hl-brackets">(</span><span class="hl-identifier">command</span><span class="hl-code">=</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">lbRSSItems</span><span class="hl-code">.</span><span class="hl-identifier">yview</span><span class="hl-brackets">)
        </span><span class="hl-identifier">scrollbarH</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">2</span><span class="hl-code">, </span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">6</span><span class="hl-code">, </span><span class="hl-identifier">sticky</span><span class="hl-code">=</span><span class="hl-identifier">E</span><span class="hl-code">+</span><span class="hl-identifier">W</span><span class="hl-brackets">)
        </span><span class="hl-identifier">scrollbarH</span><span class="hl-default">.</span><span class="hl-identifier">config</span><span class="hl-brackets">(</span><span class="hl-identifier">command</span><span class="hl-code">=</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">lbRSSItems</span><span class="hl-code">.</span><span class="hl-identifier">xview</span><span class="hl-brackets">)
        
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Create the Frame for space between the ListBoxes and
        the Text</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">spaceframe</span><span class="hl-default"> = </span><span class="hl-identifier">Frame</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">height</span><span class="hl-code">=</span><span class="hl-number">5</span><span class="hl-brackets">)
        </span><span class="hl-identifier">spaceframe</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">4</span><span class="hl-code">,</span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">1</span><span class="hl-brackets">)
        
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Create the Text Widget</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">scrollbarV</span><span class="hl-default"> = </span><span class="hl-identifier">Scrollbar</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">orient</span><span class="hl-code">=</span><span class="hl-identifier">VERTICAL</span><span class="hl-brackets">)
        </span><span class="hl-identifier">scrollbarH</span><span class="hl-default"> = </span><span class="hl-identifier">Scrollbar</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">orient</span><span class="hl-code">=</span><span class="hl-identifier">HORIZONTAL</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">txtItem</span><span class="hl-default"> = </span><span class="hl-identifier">Text</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">wrap</span><span class="hl-code">=</span><span class="hl-identifier">WORD</span><span class="hl-code">
                             , </span><span class="hl-identifier">yscrollcommand</span><span class="hl-code">=</span><span class="hl-identifier">scrollbarV</span><span class="hl-code">.</span><span class="hl-identifier">set</span><span class="hl-code">
                             , </span><span class="hl-identifier">xscrollcommand</span><span class="hl-code">=</span><span class="hl-identifier">scrollbarH</span><span class="hl-code">.</span><span class="hl-identifier">set</span><span class="hl-code">
                             , </span><span class="hl-identifier">relief</span><span class="hl-code">=</span><span class="hl-identifier">SUNKEN</span><span class="hl-code">
                             , </span><span class="hl-identifier">takefocus</span><span class="hl-code">=</span><span class="hl-number">0</span><span class="hl-code">
                             , </span><span class="hl-identifier">borderwidth</span><span class="hl-code">=</span><span class="hl-number">1</span><span class="hl-code">
                             , </span><span class="hl-identifier">state</span><span class="hl-code">=</span><span class="hl-identifier">NORMAL</span><span class="hl-code">
                             , </span><span class="hl-identifier">cursor</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">arrow</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">txtItem</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">5</span><span class="hl-code">, </span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">0</span><span class="hl-code">
                           , </span><span class="hl-identifier">columnspan</span><span class="hl-code">=</span><span class="hl-number">7</span><span class="hl-code">, </span><span class="hl-identifier">sticky</span><span class="hl-code">=</span><span class="hl-identifier">N</span><span class="hl-code">+</span><span class="hl-identifier">W</span><span class="hl-code">+</span><span class="hl-identifier">S</span><span class="hl-code">+</span><span class="hl-identifier">E</span><span class="hl-brackets">)
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Show the scrollbars and attatch them</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">scrollbarV</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">5</span><span class="hl-code">, </span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">7</span><span class="hl-code">, </span><span class="hl-identifier">sticky</span><span class="hl-code">=</span><span class="hl-identifier">N</span><span class="hl-code">+</span><span class="hl-identifier">S</span><span class="hl-brackets">)
        </span><span class="hl-identifier">scrollbarV</span><span class="hl-default">.</span><span class="hl-identifier">config</span><span class="hl-brackets">(</span><span class="hl-identifier">command</span><span class="hl-code">=</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">txtItem</span><span class="hl-code">.</span><span class="hl-identifier">yview</span><span class="hl-brackets">)
        </span><span class="hl-identifier">scrollbarH</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">6</span><span class="hl-code">, </span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">0</span><span class="hl-code">, </span><span class="hl-identifier">columnspan</span><span class="hl-code">=</span><span class="hl-number">7</span><span class="hl-code">, </span><span class="hl-identifier">sticky</span><span class="hl-code">=</span><span class="hl-identifier">E</span><span class="hl-code">+</span><span class="hl-identifier">W</span><span class="hl-brackets">)
        </span><span class="hl-identifier">scrollbarH</span><span class="hl-default">.</span><span class="hl-identifier">config</span><span class="hl-brackets">(</span><span class="hl-identifier">command</span><span class="hl-code">=</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">txtItem</span><span class="hl-code">.</span><span class="hl-identifier">xview</span><span class="hl-brackets">)
        
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">txtItem</span><span class="hl-default">.</span><span class="hl-identifier">tag_config</span><span class="hl-brackets">(</span><span class="hl-quotes">&quot;</span><span class="hl-string">a</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-identifier">foreground</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">blue</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-identifier">underline</span><span class="hl-code">=</span><span class="hl-number">1</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">txtItem</span><span class="hl-default">.</span><span class="hl-identifier">tag_bind</span><span class="hl-brackets">(</span><span class="hl-quotes">&quot;</span><span class="hl-string">a</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-quotes">&quot;</span><span class="hl-string">&lt;enter&gt;</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">show_hand_cursor</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">txtItem</span><span class="hl-default">.</span><span class="hl-identifier">tag_bind</span><span class="hl-brackets">(</span><span class="hl-quotes">&quot;</span><span class="hl-string">a</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-quotes">&quot;</span><span class="hl-string">&lt;leave&gt;</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">show_arrow_cursor</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">txtItem</span><span class="hl-default">.</span><span class="hl-identifier">tag_bind</span><span class="hl-brackets">(</span><span class="hl-quotes">&quot;</span><span class="hl-string">a</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">&lt;button -1&gt;</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">ClickText</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">txtItem</span><span class="hl-default">.</span><span class="hl-identifier">config</span><span class="hl-brackets">(</span><span class="hl-identifier">cursor</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">arrow</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)
        
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">txtItem</span><span class="hl-default">.</span><span class="hl-identifier">insert</span><span class="hl-brackets">(</span><span class="hl-identifier">INSERT</span><span class="hl-code">, </span><span class="hl-quotes">&quot;</span><span class="hl-string">click here!</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-quotes">&quot;</span><span class="hl-string">a</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">txtItem</span><span class="hl-default">.</span><span class="hl-identifier">config</span><span class="hl-brackets">(</span><span class="hl-identifier">state</span><span class="hl-code">=</span><span class="hl-identifier">DISABLED</span><span class="hl-brackets">)
               
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Create the Set TextButton</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">btnSetText</span><span class="hl-default"> = </span><span class="hl-identifier">Button</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">text</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">SetText</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-identifier">command</span><span class="hl-code">=</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">SetStoryText</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">btnSetText</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">6</span><span class="hl-code">, </span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">3</span><span class="hl-code">, </span><span class="hl-identifier">stick</span><span class="hl-code">=</span><span class="hl-identifier">E</span><span class="hl-code">, </span><span class="hl-identifier">pady</span><span class="hl-code">=</span><span class="hl-number">5</span><span class="hl-brackets">)
        
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Just fill up the listbox with some numbers</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-reserved">for </span><span class="hl-identifier">i </span><span class="hl-reserved">in </span><span class="hl-builtin">range</span><span class="hl-brackets">(</span><span class="hl-number">40</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">lbSites</span><span class="hl-default">.</span><span class="hl-identifier">insert</span><span class="hl-brackets">(</span><span class="hl-identifier">END</span><span class="hl-code">, </span><span class="hl-identifier">i</span><span class="hl-brackets">)
            </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbRSSItems</span><span class="hl-default">.</span><span class="hl-identifier">insert</span><span class="hl-brackets">(</span><span class="hl-identifier">END</span><span class="hl-code">, </span><span class="hl-identifier">i</span><span class="hl-brackets">)
            
    </span><span class="hl-reserved">def </span><span class="hl-identifier">show_hand_cursor</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">event</span><span class="hl-brackets">)</span><span class="hl-default">:
        </span><span class="hl-identifier">event</span><span class="hl-default">.</span><span class="hl-identifier">widget</span><span class="hl-default">.</span><span class="hl-identifier">configure</span><span class="hl-brackets">(</span><span class="hl-identifier">cursor</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">hand2</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)
    </span><span class="hl-reserved">def </span><span class="hl-identifier">show_arrow_cursor</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">event</span><span class="hl-brackets">)</span><span class="hl-default">:
        </span><span class="hl-identifier">event</span><span class="hl-default">.</span><span class="hl-identifier">widget</span><span class="hl-default">.</span><span class="hl-identifier">configure</span><span class="hl-brackets">(</span><span class="hl-identifier">cursor</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">arrow</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">) 
            
    </span><span class="hl-reserved">def </span><span class="hl-identifier">DblCLickSites</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">event</span><span class="hl-brackets">)</span><span class="hl-default">:
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Called when lbSites is double-clicked on&quot;
        event containts the x and y position of the click, but since
        we only care about the current selection we can ignore it</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">Display</span><span class="hl-brackets">()
        
    </span><span class="hl-reserved">def </span><span class="hl-identifier">ClickText</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">event</span><span class="hl-brackets">)</span><span class="hl-default">:
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Called when hypelink text is clicked on in the Text Widget
        event contians event information but since
        we only care about the current selection we can ignore it</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">SetStoryText</span><span class="hl-brackets">()
        
    </span><span class="hl-reserved">def </span><span class="hl-identifier">Display</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">&quot;&quot;&quot;</span><span class="hl-string">Called when btnDisplay is clicked, displays the contents of self.enText</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">lstCurrSel</span><span class="hl-default"> = </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbSites</span><span class="hl-default">.</span><span class="hl-identifier">curselection</span><span class="hl-brackets">()</span><span class="hl-default">;
        </span><span class="hl-identifier">strSelection</span><span class="hl-default"> = </span><span class="hl-quotes">&quot;&quot;</span><span class="hl-default">;
        
        </span><span class="hl-identifier">if </span><span class="hl-brackets">(</span><span class="hl-builtin">len</span><span class="hl-brackets">(</span><span class="hl-identifier">lstCurrSel</span><span class="hl-brackets">)</span><span class="hl-code">==</span><span class="hl-number">0</span><span class="hl-brackets">)</span><span class="hl-default">:
            </span><span class="hl-identifier">strSelection</span><span class="hl-default"> = </span><span class="hl-quotes">&quot;</span><span class="hl-string">Nothing yet!</span><span class="hl-quotes">&quot;
        </span><span class="hl-reserved">else</span><span class="hl-default">:
            </span><span class="hl-identifier">strSelection</span><span class="hl-default"> = </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbSites</span><span class="hl-default">.</span><span class="hl-identifier">get</span><span class="hl-brackets">(</span><span class="hl-identifier">lstCurrSel</span><span class="hl-brackets">)
        </span><span class="hl-identifier">tkMessageBox</span><span class="hl-default">.</span><span class="hl-identifier">showinfo</span><span class="hl-brackets">(</span><span class="hl-quotes">&quot;</span><span class="hl-string">Text</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-quotes">&quot;</span><span class="hl-string">You selected: %s</span><span class="hl-quotes">&quot;</span><span class="hl-code"> % </span><span class="hl-identifier">strSelection</span><span class="hl-brackets">)
    
    </span><span class="hl-reserved">def </span><span class="hl-identifier">SetStoryText</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">&quot;&quot;&quot;</span><span class="hl-string">Set the Story text, called form the btnSetText</span><span class="hl-quotes">&quot;&quot;&quot;
        
        &quot;&quot;&quot;</span><span class="hl-string">Get the Current selection</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">lstCurrSel</span><span class="hl-default"> = </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbRSSItems</span><span class="hl-default">.</span><span class="hl-identifier">curselection</span><span class="hl-brackets">()</span><span class="hl-default">;
        </span><span class="hl-identifier">strSelection</span><span class="hl-default"> = </span><span class="hl-quotes">&quot;&quot;</span><span class="hl-default">;
        
        </span><span class="hl-identifier">if </span><span class="hl-brackets">(</span><span class="hl-builtin">len</span><span class="hl-brackets">(</span><span class="hl-identifier">lstCurrSel</span><span class="hl-brackets">)</span><span class="hl-code">==</span><span class="hl-number">0</span><span class="hl-brackets">)</span><span class="hl-default">:
            </span><span class="hl-identifier">strSelection</span><span class="hl-default"> = </span><span class="hl-quotes">&quot;</span><span class="hl-string">Nothing yet!</span><span class="hl-quotes">&quot;
        </span><span class="hl-reserved">else</span><span class="hl-default">:
            </span><span class="hl-identifier">strSelection</span><span class="hl-default"> = </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbRSSItems</span><span class="hl-default">.</span><span class="hl-identifier">get</span><span class="hl-brackets">(</span><span class="hl-identifier">lstCurrSel</span><span class="hl-brackets">)
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Set the Text Widgets text</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">txtItem</span><span class="hl-default">.</span><span class="hl-identifier">config</span><span class="hl-brackets">(</span><span class="hl-identifier">state</span><span class="hl-code">=</span><span class="hl-identifier">NORMAL</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">txtItem</span><span class="hl-default">.</span><span class="hl-identifier">delete</span><span class="hl-brackets">(</span><span class="hl-number">1.0</span><span class="hl-code">,</span><span class="hl-identifier">END</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">txtItem</span><span class="hl-default">.</span><span class="hl-identifier">insert</span><span class="hl-brackets">(</span><span class="hl-identifier">INSERT</span><span class="hl-code">, </span><span class="hl-identifier">strSelection</span><span class="hl-code">, </span><span class="hl-quotes">&quot;</span><span class="hl-string">a</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">txtItem</span><span class="hl-default">.</span><span class="hl-identifier">config</span><span class="hl-brackets">(</span><span class="hl-identifier">state</span><span class="hl-code">=</span><span class="hl-identifier">DISABLED</span><span class="hl-brackets">)
                
</span><span class="hl-reserved">if </span><span class="hl-identifier">__name__</span><span class="hl-default"> == </span><span class="hl-quotes">&quot;</span><span class="hl-string">__main__</span><span class="hl-quotes">&quot;</span><span class="hl-default">:
    </span><span class="hl-identifier">guiFrame</span><span class="hl-default"> = </span><span class="hl-identifier">GUIFramework</span><span class="hl-brackets">()
    </span><span class="hl-identifier">guiFrame</span><span class="hl-default">.</span><span class="hl-identifier">mainloop</span><span class="hl-brackets">()</span></pre></div></div>
<p>Links that helped me get through this post:</p>
<ul>
<li><a href="http://www.pythonware.com/library/tkinter/introduction/">http://www.pythonware.com/library/tkinter/introduction/</a></li>
<li><a href="http://infohost.nmt.edu/tcc/help/pubs/tkinter/">http://infohost.nmt.edu/tcc/help/pubs/tkinter/</a></li>
</ul>
<p>If you like this post remember to <a href="http://digg.com/programming/Creating_a_GUI_in_Python_using_Tkinter_-_Part_2">digg it</a>.</button></leave></enter></double></p>
<div style="float:right;margin:0px 0px 0px 0px;"><a href="http://www.google.com/reader/link?url=http://www.learningpython.com/2006/02/19/creating-a-gui-in-python-using-tkinter-part-2/&title=Creating a GUI in Python using Tkinter - Part 2&srcTitle=learning python&srcURL=http://www.learningpython.com"target="_blank" rel=""><img border="0" src="http://www.learningpython.com/wp-content/plugins/wp-google-buzz/icon/12.png" style="opacity:1;filter:alpha(opacity=100)" onmouseover="this.style.opacity=0.8;this.filters.alpha.opacity=70" onmouseout="this.style.opacity=1;this.filters.alpha.opacity=100"/> </a></div>]]></content:encoded>
			<wfw:commentRss>http://www.learningpython.com/2006/02/19/creating-a-gui-in-python-using-tkinter-part-2/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Creating a GUI in Python using Tkinter</title>
		<link>http://www.learningpython.com/2006/02/08/creating-a-gui-in-python-using-tkinter/</link>
		<comments>http://www.learningpython.com/2006/02/08/creating-a-gui-in-python-using-tkinter/#comments</comments>
		<pubDate>Wed, 08 Feb 2006 05:42:53 +0000</pubDate>
		<dc:creator>selsine</dc:creator>
				<category><![CDATA[beginnings]]></category>
		<category><![CDATA[gui]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[reference]]></category>
		<category><![CDATA[tkinter]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.learningpython.com/?p=11</guid>
		<description><![CDATA[
			
				
			
		
Up until now we&#8217;ve focused on python applications that only run in the command line.  For a lot of tasks this is great, but in order to be really impressive we&#8217;re going to want to create a GUI for some of our python applications.
There are a lot of python GUI toolkits out there, but [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.learningpython.com%2F2006%2F02%2F08%2Fcreating-a-gui-in-python-using-tkinter%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.learningpython.com%2F2006%2F02%2F08%2Fcreating-a-gui-in-python-using-tkinter%2F&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>Up until now we&#8217;ve focused on python applications that only run in the command line.  For a lot of tasks this is great, but in order to be really impressive we&#8217;re going to want to create a GUI for some of our python applications.</p>
<p>There are a lot of python GUI toolkits out there, but for our first application we are going to use Tkinter, which is considered somewhat of a <em>standard</em> right now and is installed when pyhon is installed.  Another nice thing about the Tkinter GUI is that it is cross platform and offers a native look and feel on *nix, Windows, and OS X.</p>
<h3>Tkinter Example One</h3>
<p>So lets start off with a simply &#8220;Hello World&#8221; GUI app:</p>
<div class="hl-surround" style="height:280px;"><div class="hl-main"><pre><span class="hl-comment">#! /usr/bin/env python
</span><span class="hl-reserved">from </span><span class="hl-identifier">Tkinter </span><span class="hl-reserved">import</span><span class="hl-default"> *

</span><span class="hl-reserved">class </span><span class="hl-identifier">GUIFramework</span><span class="hl-brackets">(</span><span class="hl-identifier">Frame</span><span class="hl-brackets">)</span><span class="hl-default">:
    </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">This is the GUI</span><span class="hl-quotes">&quot;&quot;&quot;
    
    </span><span class="hl-reserved">def </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">master</span><span class="hl-code">=</span><span class="hl-reserved">None</span><span class="hl-brackets">)</span><span class="hl-default">:
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Initialize</span><span class="hl-quotes">&quot;&quot;&quot;
        
        &quot;&quot;&quot;</span><span class="hl-string">Initialize the base class</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">Frame</span><span class="hl-default">.</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">master</span><span class="hl-brackets">)
        
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Display the main window</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">()
        
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Create the Text</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">HelloLabel</span><span class="hl-default"> = </span><span class="hl-identifier">Label</span><span class="hl-brackets">(</span><span class="hl-identifier">master</span><span class="hl-code">, </span><span class="hl-identifier">text</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">Hello World!</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">HelloLabel</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">()
                
</span><span class="hl-reserved">if </span><span class="hl-identifier">__name__</span><span class="hl-default"> == </span><span class="hl-quotes">&quot;</span><span class="hl-string">__main__</span><span class="hl-quotes">&quot;</span><span class="hl-default">:
    </span><span class="hl-identifier">guiFrame</span><span class="hl-default"> = </span><span class="hl-identifier">GUIFramework</span><span class="hl-brackets">()
    </span><span class="hl-identifier">guiFrame</span><span class="hl-default">.</span><span class="hl-identifier">mainloop</span><span class="hl-brackets">()</span></pre></div></div>
<p>Running this on OS X results in the following:</p>
<p><img style="margin: 0pt 10px 10px 0pt;" src="http://www.learningpython.com/images/HelloWorld.png" alt="hello world python gui" /></p>
<p>And running it in Windows Xp gives you:</p>
<p><img style="margin: 0pt 10px 10px 0pt;" src="http://www.learningpython.com/images/WinPyGUI1.png" alt="hello world python gui" /><br />
<span id="more-11"></span><br />
As you can see the code used to create the GUI is pretty simple and easy to understand, but it is actually more complicated then need be because it uses classes.  But since I&#8217;ll be using classes whenever building a GUI I thought that this was the best starting point.  We start off by importing the Tkinter library into our program using this following:</p>
<div class="hl-surround" style="height:28px;"><div class="hl-main"><pre><span class="hl-reserved">from </span><span class="hl-identifier">Tkinter </span><span class="hl-reserved">import</span><span class="hl-default"> *</span></pre></div></div>
<p>After that we create a class called <em>GUIFramework</em>, which is the class that will be used to great the GUI elements in Tkinter and uses the Tkinter <a href="http://www.pythonware.com/library/tkinter/introduction/frame.htm#AEN4819">frame</a> class as its base.  For now all the work that we do is done in the <em>__init__</em> function. </p>
<p>There we first initialize the base class (which will initialize Tkinter) and then tell ourselves to be visible:</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Initialise the base class</span><span class="hl-quotes">&quot;&quot;&quot;
</span><span class="hl-identifier">Frame</span><span class="hl-default">.</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">master</span><span class="hl-brackets">)

</span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Display the main window</span><span class="hl-quotes">&quot;&quot;&quot;
</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">()</span></pre></div></div>
<p>To display ourselves we use the <a href="http://www.pythonware.com/library/tkinter/introduction/grid.htm">grid geometry manager</a>, the grid geometry manager is a straight forward way to display widgets and position them.  Since we have no other widgets in this example the defaults are fine, take a look at example two for for information on widget placement using the grid function.</p>
<p>Next is the process of creating the <em>HelloWorld</em> <a href="http://www.pythonware.com/library/tkinter/introduction/label.htm">label widget</a>,  which is a member of the <em>GUIFramework</em> class, and setting it to be visible.  It&#8217;s a good idea to make your widgets members of the class in case you need to access them later, but if you&#8217;re sure that you&#8217;ll never have to access them later, you can just create them locally.</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">HelloLabel</span><span class="hl-default"> = </span><span class="hl-identifier">Label</span><span class="hl-brackets">(</span><span class="hl-identifier">master</span><span class="hl-code">, </span><span class="hl-identifier">text</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">Hello World!</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)
</span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">HelloLabel</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">()</span></pre></div></div>
<p>After that all the other processing is done in the &#8220;main&#8221; section of our code where we initialize our class and tell it to enter the &#8220;mainloop&#8221;.    The &#8220;mainloop&#8221; is basically the application responding to events:</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-reserved">if </span><span class="hl-identifier">__name__</span><span class="hl-default"> == </span><span class="hl-quotes">&quot;</span><span class="hl-string">__main__</span><span class="hl-quotes">&quot;</span><span class="hl-default">:
    </span><span class="hl-identifier">guiFrame</span><span class="hl-default"> = </span><span class="hl-identifier">GUIFramework</span><span class="hl-brackets">()
    </span><span class="hl-identifier">guiFrame</span><span class="hl-default">.</span><span class="hl-identifier">mainloop</span><span class="hl-brackets">()</span></pre></div></div>
<h3>Tkinter Example Two</h3>
<p>Next I&#8217;ll show you a more complicated example, I won&#8217;t go into specifics with this one since it&#8217;s still pretty simple.  But if you have any questions about the following code feel free to ask via a comment.</p>
<div class="hl-surround" style="height:280px;"><div class="hl-main"><pre><span class="hl-comment">#! /usr/bin/env python
</span><span class="hl-reserved">from </span><span class="hl-identifier">Tkinter </span><span class="hl-reserved">import</span><span class="hl-default"> *
</span><span class="hl-reserved">import </span><span class="hl-identifier">tkMessageBox

</span><span class="hl-reserved">class </span><span class="hl-identifier">GUIFramework</span><span class="hl-brackets">(</span><span class="hl-identifier">Frame</span><span class="hl-brackets">)</span><span class="hl-default">:
    </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">This is the GUI</span><span class="hl-quotes">&quot;&quot;&quot;
    
    </span><span class="hl-reserved">def </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">master</span><span class="hl-code">=</span><span class="hl-reserved">None</span><span class="hl-brackets">)</span><span class="hl-default">:
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Initialize yourself</span><span class="hl-quotes">&quot;&quot;&quot;
        
        &quot;&quot;&quot;</span><span class="hl-string">Initialise the base class</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">Frame</span><span class="hl-default">.</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">master</span><span class="hl-brackets">)
        
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Set the Window Title</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">master</span><span class="hl-default">.</span><span class="hl-identifier">title</span><span class="hl-brackets">(</span><span class="hl-quotes">&quot;</span><span class="hl-string">Type Some Text</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)
        
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Display the main window&quot;
        with a little bit of padding</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">padx</span><span class="hl-code">=</span><span class="hl-number">10</span><span class="hl-code">,</span><span class="hl-identifier">pady</span><span class="hl-code">=</span><span class="hl-number">10</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">CreateWidgets</span><span class="hl-brackets">()
       
    </span><span class="hl-reserved">def </span><span class="hl-identifier">CreateWidgets</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">&quot;&quot;&quot;</span><span class="hl-string">Create all the widgets that we need</span><span class="hl-quotes">&quot;&quot;&quot;
                
        &quot;&quot;&quot;</span><span class="hl-string">Create the Text</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbText</span><span class="hl-default"> = </span><span class="hl-identifier">Label</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">text</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">Enter Text:</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">lbText</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">0</span><span class="hl-code">, </span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">0</span><span class="hl-brackets">)
        
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Create the Entry, set it to be a bit wider</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">enText</span><span class="hl-default"> = </span><span class="hl-identifier">Entry</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">enText</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">0</span><span class="hl-code">, </span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">1</span><span class="hl-code">, </span><span class="hl-identifier">columnspan</span><span class="hl-code">=</span><span class="hl-number">3</span><span class="hl-brackets">)
        
        </span><span class="hl-quotes">&quot;&quot;&quot;</span><span class="hl-string">Create the Button, set the text and the 
        command that will be called when the button is clicked</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">btnDisplay</span><span class="hl-default"> = </span><span class="hl-identifier">Button</span><span class="hl-brackets">(</span><span class="hl-identifier">self</span><span class="hl-code">, </span><span class="hl-identifier">text</span><span class="hl-code">=</span><span class="hl-quotes">&quot;</span><span class="hl-string">Display!</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-identifier">command</span><span class="hl-code">=</span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">Display</span><span class="hl-brackets">)
        </span><span class="hl-identifier">self</span><span class="hl-default">.</span><span class="hl-identifier">btnDisplay</span><span class="hl-default">.</span><span class="hl-identifier">grid</span><span class="hl-brackets">(</span><span class="hl-identifier">row</span><span class="hl-code">=</span><span class="hl-number">0</span><span class="hl-code">, </span><span class="hl-identifier">column</span><span class="hl-code">=</span><span class="hl-number">4</span><span class="hl-brackets">)
        
    </span><span class="hl-reserved">def </span><span class="hl-identifier">Display</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">&quot;&quot;&quot;</span><span class="hl-string">Called when btnDisplay is clicked, displays the contents of self.enText</span><span class="hl-quotes">&quot;&quot;&quot;
        </span><span class="hl-identifier">tkMessageBox</span><span class="hl-default">.</span><span class="hl-identifier">showinfo</span><span class="hl-brackets">(</span><span class="hl-quotes">&quot;</span><span class="hl-string">Text</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-quotes">&quot;</span><span class="hl-string">You typed: %s</span><span class="hl-quotes">&quot;</span><span class="hl-code"> % </span><span class="hl-identifier">self</span><span class="hl-code">.</span><span class="hl-identifier">enText</span><span class="hl-code">.</span><span class="hl-identifier">get</span><span class="hl-brackets">())    
                
</span><span class="hl-reserved">if </span><span class="hl-identifier">__name__</span><span class="hl-default"> == </span><span class="hl-quotes">&quot;</span><span class="hl-string">__main__</span><span class="hl-quotes">&quot;</span><span class="hl-default">:
    </span><span class="hl-identifier">guiFrame</span><span class="hl-default"> = </span><span class="hl-identifier">GUIFramework</span><span class="hl-brackets">()
    </span><span class="hl-identifier">guiFrame</span><span class="hl-default">.</span><span class="hl-identifier">mainloop</span><span class="hl-brackets">()</span></pre></div></div>
<p>This creates the following window:<br />
<img style="margin: 0pt 10px 10px 0pt;" src="http://www.learningpython.com/images/GuiWnd2.png" alt="hello world python gui" /></p>
<p>That shows this dialog when the button is pressed:<br />
<img style="margin: 0pt 10px 10px 0pt;" src="http://www.learningpython.com/images/GuiWnd2Res.png" alt="hello world python gui" /></p>
<p>Links that helped me get through this post:</p>
<ul>
<li><a href="http://www.pythonware.com/library/tkinter/introduction/">http://www.pythonware.com/library/tkinter/introduction/</a></li>
<li><a href="http://infohost.nmt.edu/tcc/help/pubs/tkinter/">http://infohost.nmt.edu/tcc/help/pubs/tkinter/</a></li>
</ul>
<p>If you like this post remember to <a href="http://digg.com/programming/Creating_a_GUI_in_Python_using_Tkinter">digg it</a>.</p>
<div style="float:right;margin:0px 0px 0px 0px;"><a href="http://www.google.com/reader/link?url=http://www.learningpython.com/2006/02/08/creating-a-gui-in-python-using-tkinter/&title=Creating a GUI in Python using Tkinter&srcTitle=learning python&srcURL=http://www.learningpython.com"target="_blank" rel=""><img border="0" src="http://www.learningpython.com/wp-content/plugins/wp-google-buzz/icon/12.png" style="opacity:1;filter:alpha(opacity=100)" onmouseover="this.style.opacity=0.8;this.filters.alpha.opacity=70" onmouseout="this.style.opacity=1;this.filters.alpha.opacity=100"/> </a></div>]]></content:encoded>
			<wfw:commentRss>http://www.learningpython.com/2006/02/08/creating-a-gui-in-python-using-tkinter/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
	</channel>
</rss>
