<?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>The Mouse Vs. The Python &#187; wxPython</title>
	<atom:link href="http://www.blog.pythonlibrary.org/category/wxpython/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.blog.pythonlibrary.org</link>
	<description>Python Programming from the Frontlines</description>
	<lastBuildDate>Sun, 05 Sep 2010 16:58:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>wxPython: Creating a Simple Media Player</title>
		<link>http://www.blog.pythonlibrary.org/2010/07/24/wxpython-creating-a-simple-media-player/</link>
		<comments>http://www.blog.pythonlibrary.org/2010/07/24/wxpython-creating-a-simple-media-player/#comments</comments>
		<pubDate>Sat, 24 Jul 2010 16:07:20 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[wxPython]]></category>
		<category><![CDATA[media player]]></category>
		<category><![CDATA[mplayer]]></category>

		<guid isPermaLink="false">http://www.blog.pythonlibrary.org/?p=1058</guid>
		<description><![CDATA[A few months ago, I wrote about creating a simple MP3 Player using wxPython&#8217;s MediaCtrl widget. Since then, a fellow released the MplayerCtrl, a wxPython widget that wraps mplayer, a popular cross-platform media player. I actually ended up switching my MP3 Player&#8217;s backend to use this new control, but that&#8217;s a story for another post. [...]]]></description>
			<content:encoded><![CDATA[<p>A few months ago, I wrote about creating a simple MP3 Player using wxPython&#8217;s MediaCtrl widget. Since then, a fellow released the MplayerCtrl, a wxPython widget that wraps mplayer, a popular cross-platform media player. I actually ended up switching my MP3 Player&#8217;s backend to use this new control, but that&#8217;s a story for another post. This article will just focus on creating a really simple Media Player that you can play movies with. And you can do it all with Python! If you&#8217;re like me, you&#8217;ll think this rocks!<span id="more-1058"></span></p>
<h2>Playing Movies with Python &#038; Mplayer</h2>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/07/media_player.png"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/07/media_player.png" alt="" title="media_player" width="500" height="371" class="aligncenter size-full wp-image-1061" /></a><br />
<a href="http://www.imdb.com/title/tt1100119/">Screenshot is from a trailer for Shorts</a></p>
<p>First off, you&#8217;ll need to make sure you have the following:</p>
<ul>
<li><a href="http://www.python.org">Python </a>(duh!)</li>
<li><a href="http://www.wxpython.org">wxPython</a></li>
<li><a href="http://www.mplayerhq.hu">mplayer</a></li>
<li><a href="http://pypi.python.org/pypi/MplayerCtrl/">MPlayerCtrl</a></li>
</ul>
<p>Once you&#8217;ve confirmed that you have all that, we can continue. Let&#8217;s look at some code!</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span>
<span style="color: #ff7700;font-weight:bold;">import</span> wx
<span style="color: #ff7700;font-weight:bold;">import</span> MplayerCtrl as mpc
<span style="color: #ff7700;font-weight:bold;">import</span> wx.<span style="color: black;">lib</span>.<span style="color: black;">buttons</span> as buttons
&nbsp;
dirName = <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">dirname</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">abspath</span><span style="color: black;">&#40;</span>__file__<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
bitmapDir = <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span>dirName, <span style="color: #483d8b;">'bitmaps'</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Frame<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, parent, <span style="color: #008000;">id</span>, title, mplayer<span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, parent, <span style="color: #008000;">id</span>, title<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">panel</span> = wx.<span style="color: black;">Panel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
&nbsp;
        sp = wx.<span style="color: black;">StandardPaths</span>.<span style="color: black;">Get</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">currentFolder</span> = sp.<span style="color: black;">GetDocumentsDir</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">currentVolume</span> = <span style="color: #ff4500;">50</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">create_menu</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># create sizers</span>
        mainSizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        controlSizer = <span style="color: #008000;">self</span>.<span style="color: black;">build_controls</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        sliderSizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">HORIZONTAL</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">mplayer</span> = mpc.<span style="color: black;">MplayerCtrl</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">panel</span>, <span style="color: #ff4500;">-1</span>, mplayer<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">playbackSlider</span> = wx.<span style="color: black;">Slider</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">panel</span>, size=wx.<span style="color: black;">DefaultSize</span><span style="color: black;">&#41;</span>
        sliderSizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">playbackSlider</span>, <span style="color: #ff4500;">1</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">EXPAND</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># create volume control</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">volumeCtrl</span> = wx.<span style="color: black;">Slider</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">panel</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">volumeCtrl</span>.<span style="color: black;">SetRange</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">100</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">volumeCtrl</span>.<span style="color: black;">SetValue</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">currentVolume</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">volumeCtrl</span>.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_SLIDER</span>, <span style="color: #008000;">self</span>.<span style="color: black;">on_set_volume</span><span style="color: black;">&#41;</span>
        controlSizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">volumeCtrl</span>, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># create track counter</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">trackCounter</span> = wx.<span style="color: black;">StaticText</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">panel</span>, label=<span style="color: #483d8b;">&quot;00:00&quot;</span><span style="color: black;">&#41;</span>
        sliderSizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">trackCounter</span>, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># set up playback timer</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">playbackTimer</span> = wx.<span style="color: black;">Timer</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_TIMER</span>, <span style="color: #008000;">self</span>.<span style="color: black;">on_update_playback</span><span style="color: black;">&#41;</span>
&nbsp;
        mainSizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">mplayer</span>, <span style="color: #ff4500;">1</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">EXPAND</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        mainSizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>sliderSizer, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">EXPAND</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        mainSizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>controlSizer, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">panel</span>.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span>mainSizer<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>mpc.<span style="color: black;">EVT_MEDIA_STARTED</span>, <span style="color: #008000;">self</span>.<span style="color: black;">on_media_started</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>mpc.<span style="color: black;">EVT_MEDIA_FINISHED</span>, <span style="color: #008000;">self</span>.<span style="color: black;">on_media_finished</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>mpc.<span style="color: black;">EVT_PROCESS_STARTED</span>, <span style="color: #008000;">self</span>.<span style="color: black;">on_process_started</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>mpc.<span style="color: black;">EVT_PROCESS_STOPPED</span>, <span style="color: #008000;">self</span>.<span style="color: black;">on_process_stopped</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">panel</span>.<span style="color: black;">Layout</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> build_btn<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, btnDict, sizer<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        bmp = btnDict<span style="color: black;">&#91;</span><span style="color: #483d8b;">'bitmap'</span><span style="color: black;">&#93;</span>
        handler = btnDict<span style="color: black;">&#91;</span><span style="color: #483d8b;">'handler'</span><span style="color: black;">&#93;</span>
&nbsp;
        img = wx.<span style="color: black;">Bitmap</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span>bitmapDir, bmp<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        btn = buttons.<span style="color: black;">GenBitmapButton</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">panel</span>, bitmap=img,
                                      name=btnDict<span style="color: black;">&#91;</span><span style="color: #483d8b;">'name'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
        btn.<span style="color: black;">SetInitialSize</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        btn.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, handler<span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>btn, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">LEFT</span>, <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> build_controls<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        Builds the audio bar controls
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        controlSizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">HORIZONTAL</span><span style="color: black;">&#41;</span>
&nbsp;
        btnData = <span style="color: black;">&#91;</span><span style="color: black;">&#123;</span><span style="color: #483d8b;">'bitmap'</span>:<span style="color: #483d8b;">'player_pause.png'</span>,
                    <span style="color: #483d8b;">'handler'</span>:<span style="color: #008000;">self</span>.<span style="color: black;">on_pause</span>, <span style="color: #483d8b;">'name'</span>:<span style="color: #483d8b;">'pause'</span><span style="color: black;">&#125;</span>,
                   <span style="color: black;">&#123;</span><span style="color: #483d8b;">'bitmap'</span>:<span style="color: #483d8b;">'player_stop.png'</span>,
                    <span style="color: #483d8b;">'handler'</span>:<span style="color: #008000;">self</span>.<span style="color: black;">on_stop</span>, <span style="color: #483d8b;">'name'</span>:<span style="color: #483d8b;">'stop'</span><span style="color: black;">&#125;</span><span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> btn <span style="color: #ff7700;font-weight:bold;">in</span> btnData:
            <span style="color: #008000;">self</span>.<span style="color: black;">build_btn</span><span style="color: black;">&#40;</span>btn, controlSizer<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">return</span> controlSizer
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> create_menu<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        Creates a menu
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        menubar = wx.<span style="color: black;">MenuBar</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        fileMenu = wx.<span style="color: black;">Menu</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        add_file_menu_item = fileMenu.<span style="color: black;">Append</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">NewId</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, <span style="color: #483d8b;">&quot;&amp;Add File&quot;</span>, <span style="color: #483d8b;">&quot;Add Media File&quot;</span><span style="color: black;">&#41;</span>
        menubar.<span style="color: black;">Append</span><span style="color: black;">&#40;</span>fileMenu, <span style="color: #483d8b;">'&amp;File'</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">SetMenuBar</span><span style="color: black;">&#40;</span>menubar<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_MENU</span>, <span style="color: #008000;">self</span>.<span style="color: black;">on_add_file</span>, add_file_menu_item<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> on_add_file<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        Add a Movie and start playing it
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        wildcard = <span style="color: #483d8b;">&quot;Media Files (*.*)|*.*&quot;</span>
        dlg = wx.<span style="color: black;">FileDialog</span><span style="color: black;">&#40;</span>
            <span style="color: #008000;">self</span>, message=<span style="color: #483d8b;">&quot;Choose a file&quot;</span>,
            defaultDir=<span style="color: #008000;">self</span>.<span style="color: black;">currentFolder</span>,
            defaultFile=<span style="color: #483d8b;">&quot;&quot;</span>,
            wildcard=wildcard,
            style=wx.<span style="color: black;">OPEN</span> | wx.<span style="color: black;">CHANGE_DIR</span>
            <span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> dlg.<span style="color: black;">ShowModal</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == wx.<span style="color: black;">ID_OK</span>:
            path = dlg.<span style="color: black;">GetPath</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">currentFolder</span> = <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">dirname</span><span style="color: black;">&#40;</span>path<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
            trackPath = <span style="color: #483d8b;">'&quot;%s&quot;'</span> <span style="color: #66cc66;">%</span> path.<span style="color: black;">replace</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>&quot;</span>, <span style="color: #483d8b;">&quot;/&quot;</span><span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">mplayer</span>.<span style="color: black;">Loadfile</span><span style="color: black;">&#40;</span>trackPath<span style="color: black;">&#41;</span>
&nbsp;
            t_len = <span style="color: #008000;">self</span>.<span style="color: black;">mplayer</span>.<span style="color: black;">GetTimeLength</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">playbackSlider</span>.<span style="color: black;">SetRange</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, t_len<span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">playbackTimer</span>.<span style="color: black;">Start</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">100</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> on_media_started<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Media started!'</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> on_media_finished<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Media finished!'</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">playbackTimer</span>.<span style="color: black;">Stop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> on_pause<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">playbackTimer</span>.<span style="color: black;">IsRunning</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;pausing...&quot;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">mplayer</span>.<span style="color: black;">Pause</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">playbackTimer</span>.<span style="color: black;">Stop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;unpausing...&quot;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">mplayer</span>.<span style="color: black;">Pause</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">playbackTimer</span>.<span style="color: black;">Start</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> on_process_started<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Process started!'</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> on_process_stopped<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Process stopped!'</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> on_set_volume<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        Sets the volume of the music player
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">currentVolume</span> = <span style="color: #008000;">self</span>.<span style="color: black;">volumeCtrl</span>.<span style="color: black;">GetValue</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">mplayer</span>.<span style="color: black;">SetProperty</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;volume&quot;</span>, <span style="color: #008000;">self</span>.<span style="color: black;">currentVolume</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> on_stop<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;stopping...&quot;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">mplayer</span>.<span style="color: black;">Stop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">playbackTimer</span>.<span style="color: black;">Stop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> on_update_playback<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        Updates playback slider and track counter
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">try</span>:
            offset = <span style="color: #008000;">self</span>.<span style="color: black;">mplayer</span>.<span style="color: black;">GetTimePos</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">except</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> offset
        mod_off = <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>offset<span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">-1</span><span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> mod_off == <span style="color: #483d8b;">'0'</span>:
            <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;mod_off&quot;</span>
            offset = <span style="color: #008000;">int</span><span style="color: black;">&#40;</span>offset<span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">playbackSlider</span>.<span style="color: black;">SetValue</span><span style="color: black;">&#40;</span>offset<span style="color: black;">&#41;</span>
            secsPlayed = <span style="color: #dc143c;">time</span>.<span style="color: black;">strftime</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'%M:%S'</span>, <span style="color: #dc143c;">time</span>.<span style="color: black;">gmtime</span><span style="color: black;">&#40;</span>offset<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">trackCounter</span>.<span style="color: black;">SetLabel</span><span style="color: black;">&#40;</span>secsPlayed<span style="color: black;">&#41;</span></pre>
<p>We&#8217;re going to focus on the hightlights and ignore the boilerplate. If you don&#8217;t know wxPython code, then go to the wxPython website and read the tutorials. Now, to create an instance of the MplayerCtrl, we need to call <em>mpc.MplayerCtrl(self.panel, -1, mplayer)</em> and pass in the path to the mplayer. To keep track of how much of the movie has played, we create a wx.Slider. We also use a slider for the volume control. We use some of wx&#8217;s generic button widgets to give us some easy-to-use bitmap buttons. Finally, we create a timer that we&#8217;ll use to update the playback slider&#8217;s position. To load a movie and start it playing, we create a menu item.</p>
<p>The <em>build_btn</em>, <em>build_controls</em>, and <em>create_menu</em> are helper methods that build our GUI. You can figure those out for yourself. We&#8217;ll just look at a few of the mplayer-related methods. In <em>on_add_file</em>, we open a FileDialog and let the user find a movie file on their PC. Once they&#8217;ve picked one out, we hack the path to the file slightly to make it more palatable to mplayer by replacing backslashes with forward slashes. Then we call our MPlayerCtrl&#8217;s LoadFile method to load the movie into mplayer and get it started. We also start our timer and update the playback slider.</p>
<p>You can Pause or Stop the playback with the two buttons that call the appropriate methods. The MplayerCtrl also exposes lots of other methods that we can use to get the length of the movie, get the bitrate, the codec, and more. Check out the documentation to see what all you can accomplish.</p>
<h2>Wrapping Up</h2>
<p>As you can see, creating a simple media player in Python is really easy. Getting the MplayerCtrl to play something takes about 5 minutes. Adding the sliders and functions add 30-45 minutes (depending on your skillz). Feel free to add enhancements, like a playlist, a way to speed up or slow down the playback or get the frame to resize the movie so its aspect ratio is constant. Note that sometimes mplayer doesn&#8217;t want to kill the movie when you close the frame. This is a bug which the author of the control is trying to figure out. Anyway, have fun watching movies with Python!</p>
<p><em>Note: This code was tested with MplayerCtrl 0.1.2 and 0.2.4, wxPython 2.8.10.1, Python 2.5/2.6 on Windows XP and Windows 7. I used the mplayer rtm-svn-31170 version in my testing as well.</em></p>
<h2>Further Information</h2>
<ul>
<li>MplayerCtrl <a href="http://mplayerctrl.dav1d.de/docs/">Documentation</a></li>
</ul>
<h2>Downloads</h2>
<ul>
<li><a href='http://www.blog.pythonlibrary.org/wp-content/uploads/2010/07/MediaPlayer.zip'>MediaPlayer.zip</a></li>
<li><a href='http://www.blog.pythonlibrary.org/wp-content/uploads/2010/07/MediaPlayer.tar'>MediaPlayer.tar</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.blog.pythonlibrary.org/2010/07/24/wxpython-creating-a-simple-media-player/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>The Dialogs of wxPython (Part 2 of 2)</title>
		<link>http://www.blog.pythonlibrary.org/2010/07/10/the-dialogs-of-wxpython-part-2-of-2/</link>
		<comments>http://www.blog.pythonlibrary.org/2010/07/10/the-dialogs-of-wxpython-part-2-of-2/#comments</comments>
		<pubDate>Sat, 10 Jul 2010 13:58:17 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[wxPython]]></category>
		<category><![CDATA[Dialogs]]></category>

		<guid isPermaLink="false">http://www.blog.pythonlibrary.org/?p=1015</guid>
		<description><![CDATA[For the second half of this series, I discovered that there are even more dialogs than I originally thought. While it would have probably been a good idea to have split this into three parts, we&#8217;re going to stick with just two. In this article, we&#8217;re going to cover the following dialogs: GenericMessageDialog (AGW) ImageDialog [...]]]></description>
			<content:encoded><![CDATA[<p>For the second half of this series, I discovered that there are even more dialogs than I originally thought. While it would have probably been a good idea to have split this into three parts, we&#8217;re going to stick with just two. In this article, we&#8217;re going to cover the following dialogs:</p>
<ul>
<li>GenericMessageDialog (AGW)</li>
<li>ImageDialog</li>
<li>wx.MultiChoiceDialog</li>
<li>wx.PageSetupDialog</li>
<li>wx.PrintDialog</li>
<li>wx.ProgressDialog</li>
<li>PyBusyInfo (AGW)</li>
<li>PyProgress (AGW)</li>
<li>ScrolledMessageDialog</li>
<li>wx.SingleChoiceDialog</li>
<li>wx.TextEntryDialog</li>
</ul>
<p>For the uninitiated, there&#8217;s also an AboutBox dialog that&#8217;s not here for the very simple reason that it&#8217;s <a href="http://www.blog.pythonlibrary.org/2008/06/11/wxpython-creating-an-about-box/">already been covered</a> in this blog outside of this series. Check that out for yourself. Just to clear up any confusion about why wx.Dialog isn&#8217;t here: this series ONLY covers pre-built dialogs. The wx.Dialog widget is great for creating your own custom dialogs. The last note that should be covered is that the example code here has been yanked from the wxPython demo and re-purposed for this article.<span id="more-1015"></span></p>
<p>Now, on with the show!</p>
<h2>The GenericMessageDialog</h2>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/07/genericMsgDlg.png"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/07/genericMsgDlg.png" alt="" title="genericMsgDlg" width="430" height="291" class="aligncenter size-full wp-image-1017" /></a></p>
<p>The GenericMessageDialog is a part of the AGW library of generic controls created by Andrea Gavana. It gives us more options than the MessageDialog itself did because the GenericMessageDialog is written in pure python and is therefore, much more hackable. Let&#8217;s see how we can create the dialog in the screenshot:</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> images
<span style="color: #ff7700;font-weight:bold;">import</span> wx
<span style="color: #ff7700;font-weight:bold;">import</span> wx.<span style="color: black;">lib</span>.<span style="color: black;">agw</span>.<span style="color: black;">genericmessagedialog</span> as GMD
&nbsp;
_msg = <span style="color: #483d8b;">&quot;This is the about dialog of GenericMessageDialog demo.<span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> + \
       <span style="color: #483d8b;">&quot;Author: Andrea Gavana @ 07 Oct 2008<span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> + \
       <span style="color: #483d8b;">&quot;Please report any bugs/requests of improvements<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> + \
       <span style="color: #483d8b;">&quot;to me at the following addresses:<span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> + \
       <span style="color: #483d8b;">&quot;andrea.gavana@gmail.com<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> + <span style="color: #483d8b;">&quot;gavana@kpo.kz<span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> + \
       <span style="color: #483d8b;">&quot;Welcome to wxPython &quot;</span> + wx.<span style="color: black;">VERSION_STRING</span> + <span style="color: #483d8b;">&quot;!!&quot;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">########################################################################</span>
<span style="color: #ff7700;font-weight:bold;">class</span> MyForm<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
    Based on Andrea Gavana's demo from the wxPython Demo
    &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>,
                          <span style="color: #483d8b;">&quot;Generic Message Dialog Tutorial&quot;</span>,
                          size=<span style="color: black;">&#40;</span><span style="color: #ff4500;">575</span>,<span style="color: #ff4500;">225</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">mainPanel</span> = wx.<span style="color: black;">Panel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">buttonSizer_staticbox</span> = wx.<span style="color: black;">StaticBox</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">mainPanel</span>, <span style="color: #ff4500;">-1</span>, <span style="color: #483d8b;">&quot;Buttons Styles&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">ok</span> = wx.<span style="color: black;">CheckBox</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">mainPanel</span>, <span style="color: #ff4500;">-1</span>, <span style="color: #483d8b;">&quot;wx.OK&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">yes_no</span> = wx.<span style="color: black;">CheckBox</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">mainPanel</span>, <span style="color: #ff4500;">-1</span>, <span style="color: #483d8b;">&quot;wx.YES_NO&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">cancel</span> = wx.<span style="color: black;">CheckBox</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">mainPanel</span>, <span style="color: #ff4500;">-1</span>, <span style="color: #483d8b;">&quot;wx.CANCEL&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">yes</span> = wx.<span style="color: black;">CheckBox</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">mainPanel</span>, <span style="color: #ff4500;">-1</span>, <span style="color: #483d8b;">&quot;wx.YES&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">no</span> = wx.<span style="color: black;">CheckBox</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">mainPanel</span>, <span style="color: #ff4500;">-1</span>, <span style="color: #483d8b;">&quot;wx.NO&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">no_default</span> = wx.<span style="color: black;">CheckBox</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">mainPanel</span>, <span style="color: #ff4500;">-1</span>, <span style="color: #483d8b;">&quot;wx.NO_DEFAULT&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: #008000;">help</span> = wx.<span style="color: black;">CheckBox</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">mainPanel</span>, <span style="color: #ff4500;">-1</span>, <span style="color: #483d8b;">&quot;wx.HELP&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">dialogStyles</span> = wx.<span style="color: black;">RadioBox</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">mainPanel</span>, <span style="color: #ff4500;">-1</span>, <span style="color: #483d8b;">&quot;Dialog Styles&quot;</span>,
                                        choices=<span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;wx.ICON_INFORMATION&quot;</span>, <span style="color: #483d8b;">&quot;wx.ICON_WARNING&quot;</span>,
                                                 <span style="color: #483d8b;">&quot;wx.ICON_EXCLAMATION&quot;</span>, <span style="color: #483d8b;">&quot;wx.ICON_ERROR&quot;</span>,
                                                 <span style="color: #483d8b;">&quot;wx.ICON_QUESTION&quot;</span><span style="color: black;">&#93;</span>,
                                        majorDimension=<span style="color: #ff4500;">5</span>, style=wx.<span style="color: black;">RA_SPECIFY_ROWS</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">showDialog</span> = wx.<span style="color: black;">Button</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">mainPanel</span>, <span style="color: #ff4500;">-1</span>, <span style="color: #483d8b;">&quot;Show GenericMessageDialog&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">SetProperties</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">DoLayout</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">OnShowDialog</span>, <span style="color: #008000;">self</span>.<span style="color: black;">showDialog</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_CHECKBOX</span>, <span style="color: #008000;">self</span>.<span style="color: black;">OnCheckBox</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> SetProperties<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">ok</span>.<span style="color: black;">SetValue</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">dialogStyles</span>.<span style="color: black;">SetSelection</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">showDialog</span>.<span style="color: black;">SetDefault</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> DoLayout<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
&nbsp;
        frameSizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        mainSizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">HORIZONTAL</span><span style="color: black;">&#41;</span>
        buttonSizer = wx.<span style="color: black;">StaticBoxSizer</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">buttonSizer_staticbox</span>, wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        buttonSizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">ok</span>, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">LEFT</span>|wx.<span style="color: black;">RIGHT</span>|wx.<span style="color: black;">TOP</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        buttonSizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>, <span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
        buttonSizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">yes_no</span>, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">LEFT</span>|wx.<span style="color: black;">RIGHT</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        buttonSizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>, <span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
        buttonSizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">cancel</span>, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">LEFT</span>|wx.<span style="color: black;">RIGHT</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        buttonSizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>, <span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
        buttonSizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">yes</span>, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">LEFT</span>|wx.<span style="color: black;">RIGHT</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        buttonSizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>, <span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
        buttonSizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">no</span>, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">LEFT</span>|wx.<span style="color: black;">RIGHT</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        buttonSizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>, <span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
        buttonSizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">no_default</span>, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">LEFT</span>|wx.<span style="color: black;">RIGHT</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        buttonSizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>, <span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
        buttonSizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: #008000;">help</span>, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">LEFT</span>|wx.<span style="color: black;">RIGHT</span>|wx.<span style="color: black;">BOTTOM</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        mainSizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>buttonSizer, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        mainSizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">dialogStyles</span>, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        mainSizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">10</span>, <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>, <span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
        mainSizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">showDialog</span>, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">ALIGN_CENTER_HORIZONTAL</span>, <span style="color: #ff4500;">10</span><span style="color: black;">&#41;</span>
        mainSizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">10</span>, <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>, <span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">mainPanel</span>.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span>mainSizer<span style="color: black;">&#41;</span>
&nbsp;
        frameSizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">mainPanel</span>, <span style="color: #ff4500;">1</span>, wx.<span style="color: black;">EXPAND</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span>frameSizer<span style="color: black;">&#41;</span>
        frameSizer.<span style="color: black;">Layout</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> OnCheckBox<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
&nbsp;
        obj = event.<span style="color: black;">GetEventObject</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        widgets = <span style="color: black;">&#91;</span><span style="color: #008000;">self</span>.<span style="color: black;">yes</span>, <span style="color: #008000;">self</span>.<span style="color: black;">yes_no</span>, <span style="color: #008000;">self</span>.<span style="color: black;">no</span>, <span style="color: #008000;">self</span>.<span style="color: black;">no_default</span><span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> event.<span style="color: black;">IsChecked</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> obj == <span style="color: #008000;">self</span>.<span style="color: black;">ok</span>:
            <span style="color: #ff7700;font-weight:bold;">for</span> checks <span style="color: #ff7700;font-weight:bold;">in</span> widgets:
                checks.<span style="color: black;">SetValue</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">elif</span> obj <span style="color: #ff7700;font-weight:bold;">in</span> widgets:
            <span style="color: #008000;">self</span>.<span style="color: black;">ok</span>.<span style="color: black;">SetValue</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> OnShowDialog<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
&nbsp;
        btnStyle = <span style="color: #ff4500;">0</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> child <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">mainPanel</span>.<span style="color: black;">GetChildren</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">isinstance</span><span style="color: black;">&#40;</span>child, wx.<span style="color: black;">CheckBox</span><span style="color: black;">&#41;</span>:
                <span style="color: #ff7700;font-weight:bold;">if</span> child.<span style="color: black;">GetValue</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
                    btnStyle |= <span style="color: #008000;">eval</span><span style="color: black;">&#40;</span>child.<span style="color: black;">GetLabel</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
        dlgStyle = <span style="color: #008000;">eval</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">dialogStyles</span>.<span style="color: black;">GetStringSelection</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        dlg = GMD.<span style="color: black;">GenericMessageDialog</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, _msg,
                                       <span style="color: #483d8b;">&quot;A Nice Message Box&quot;</span>,
                                       btnStyle | dlgStyle<span style="color: black;">&#41;</span>
        dlg.<span style="color: black;">SetIcon</span><span style="color: black;">&#40;</span>images.<span style="color: black;">Mondrian</span>.<span style="color: black;">GetIcon</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        dlg.<span style="color: black;">ShowModal</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        dlg.<span style="color: black;">Destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Run the program</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app = wx.<span style="color: black;">App</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
    frame = MyForm<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    frame.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>The first thing to look for in any example is what is imported at the top of the file. In this case, we use the <em>images.py</em> file from the wxPython demo to supply some of the images in this example. We also import the dialog that we need from <em>wx.lib.agw.genericmessagedialog</em>. We can skip the frame&#8217;s initialization code since we want to focus on the dialog. The first dialog related method we see is <em>SetProperties</em>. It sets up a few default options in the dialog, like checking the &#8220;ok&#8221; checkbox, selecting the first radio button and putting the focus on the button that will open the generic dialog. The first two will tell our dialog creator method, <em>OnShowDialog</em>, what kind of dialog we want. Thus, our next method to look at is the OnShowDialog one. </p>
<p>Here we find that the GenericMessageDialog takes mostly the same values that a normal MessageDialog would, namely a parent, message, title caption, and some styles. You can also set its size, pos and agwstyle when applicable. We can also add an icon to the dialog by calling SetIcon. There you have it! A generic message dialog!</p>
<h2>View Images with ImageDialog</h2>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/07/imageDialog.png"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/07/imageDialog.png" alt="" title="imageDialog" width="400" height="400" class="aligncenter size-full wp-image-1020" /></a></p>
<p>The ImageDialog is a handy little dialog that you can use to preview various image formats. This dialog is another generic dialog, but it&#8217;s not part of the AGW library. The ImageDialog is quite handy and super easy to create. How easy? Well check out the code below and see for yourself!</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>
<span style="color: #ff7700;font-weight:bold;">import</span> wx
<span style="color: #ff7700;font-weight:bold;">import</span> wx.<span style="color: black;">lib</span>.<span style="color: black;">imagebrowser</span> as ib
&nbsp;
<span style="color: #808080; font-style: italic;">########################################################################</span>
<span style="color: #ff7700;font-weight:bold;">class</span> MyForm<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>,
                          <span style="color: #483d8b;">&quot;ImageDialog Tutorial&quot;</span><span style="color: black;">&#41;</span>
        panel = wx.<span style="color: black;">Panel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, wx.<span style="color: black;">ID_ANY</span><span style="color: black;">&#41;</span>
        b = wx.<span style="color: black;">Button</span><span style="color: black;">&#40;</span>panel, label=<span style="color: #483d8b;">&quot;Create and Show a ImageDialog&quot;</span><span style="color: black;">&#41;</span>
        b.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onButton</span><span style="color: black;">&#41;</span>
&nbsp;
        sizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>b, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        panel.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span>sizer<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onButton<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        Based on the wxPython demo by the same name
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        <span style="color: #808080; font-style: italic;"># get current working directory</span>
        <span style="color: #008000;">dir</span> = <span style="color: #dc143c;">os</span>.<span style="color: black;">getcwd</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># set the initial directory for the demo bitmaps</span>
        initial_dir = <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: #008000;">dir</span>, <span style="color: #483d8b;">'bitmaps'</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># open the image browser dialog</span>
        dlg = ib.<span style="color: black;">ImageDialog</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, initial_dir<span style="color: black;">&#41;</span>
&nbsp;
        dlg.<span style="color: black;">Centre</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> dlg.<span style="color: black;">ShowModal</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == wx.<span style="color: black;">ID_OK</span>:
            <span style="color: #808080; font-style: italic;"># show the selected file</span>
            <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;You Selected File: &quot;</span> + dlg.<span style="color: black;">GetFile</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;You pressed Cancel&quot;</span>
&nbsp;
        dlg.<span style="color: black;">Destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
<span style="color: #808080; font-style: italic;"># Run the program</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app = wx.<span style="color: black;">App</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
    frame = MyForm<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    frame.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>If you look in the <em>onButton</em> method, you can see how we initialize this dialog. Basically all you need to feed the control is a parent and a directory full of images, then show the dialog. That&#8217;s it! Didn&#8217;t I tell you it was easy?</p>
<h2>Making Choices with wx.MultiChoiceDialog</h2>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/07/multipleChoiceDialog.png"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/07/multipleChoiceDialog.png" alt="" title="multipleChoiceDialog" width="348" height="351" class="aligncenter size-full wp-image-1021" /></a></p>
<p>What do you do if you need to ask the user for one or more pieces of simple information? You can create your own control or you might choose the <em>wx.MultiChoiceDialog</em>. The MultiChoiceDialog provides you the ability to serve up a dialog that allows the user to choose multiple choices. Yes, it is pretty obvious&#8230;so on to the code!</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> wx
&nbsp;
<span style="color: #808080; font-style: italic;">########################################################################</span>
<span style="color: #ff7700;font-weight:bold;">class</span> MyForm<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>,
                          <span style="color: #483d8b;">&quot;MultiChoiceDialog Tutorial&quot;</span><span style="color: black;">&#41;</span>
        panel = wx.<span style="color: black;">Panel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, wx.<span style="color: black;">ID_ANY</span><span style="color: black;">&#41;</span>
        b = wx.<span style="color: black;">Button</span><span style="color: black;">&#40;</span>panel, label=<span style="color: #483d8b;">&quot;Create and Show a wx.MultiChoiceDialog&quot;</span><span style="color: black;">&#41;</span>
        b.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onButton</span><span style="color: black;">&#41;</span>
&nbsp;
        sizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>b, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        panel.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span>sizer<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onButton<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        Based on the wxPython demo - opens the MultiChoiceDialog
        and prints the user's selection(s) to stdout
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        lst = <span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;Python&quot;</span>, <span style="color: #483d8b;">&quot;Ruby&quot;</span>, <span style="color: #483d8b;">&quot;Perl&quot;</span>, <span style="color: #483d8b;">&quot;PHP&quot;</span><span style="color: black;">&#93;</span>
        dlg = wx.<span style="color: black;">MultiChoiceDialog</span><span style="color: black;">&#40;</span> <span style="color: #008000;">self</span>,
                                   <span style="color: #483d8b;">&quot;Pick some programming languages&quot;</span>,
                                   <span style="color: #483d8b;">&quot;wx.MultiChoiceDialog&quot;</span>, lst<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: black;">&#40;</span>dlg.<span style="color: black;">ShowModal</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == wx.<span style="color: black;">ID_OK</span><span style="color: black;">&#41;</span>:
            selections = dlg.<span style="color: black;">GetSelections</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            strings = <span style="color: black;">&#91;</span>lst<span style="color: black;">&#91;</span>x<span style="color: black;">&#93;</span> <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> selections<span style="color: black;">&#93;</span>
            <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;You chose:&quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>strings<span style="color: black;">&#41;</span>
&nbsp;
        dlg.<span style="color: black;">Destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
<span style="color: #808080; font-style: italic;"># Run the program</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app = wx.<span style="color: black;">App</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
    frame = MyForm<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    frame.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>The <em>MultiChoiceDialog </em>is like most dialogs. It accepts a parent, descriptive label, window caption and a list of choices. To get the user&#8217;s selections, all you need to do is call the dialog&#8217;s <em>GetSelections</em> method. That&#8217;s it!</p>
<h2>wx.PageSetupDialog</h2>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/07/pagesetupDlg.png"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/07/pagesetupDlg.png" alt="" title="pagesetupDlg" width="498" height="525" class="aligncenter size-full wp-image-1022" /></a></p>
<p>The wx.PageSetupDialog is used for setting up a few parameters for printing out a page or just setting up a page for editing. You can use it to adjust paper size, margins and whether or not the page should be in landscape or portrait orientations. Here&#8217;s how you set one up:</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> wx
&nbsp;
<span style="color: #808080; font-style: italic;">########################################################################</span>
<span style="color: #ff7700;font-weight:bold;">class</span> MyForm<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>,
                          <span style="color: #483d8b;">&quot;PageSetupDialog Tutorial&quot;</span><span style="color: black;">&#41;</span>
        panel = wx.<span style="color: black;">Panel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, wx.<span style="color: black;">ID_ANY</span><span style="color: black;">&#41;</span>
        b = wx.<span style="color: black;">Button</span><span style="color: black;">&#40;</span>panel, label=<span style="color: #483d8b;">&quot;Create and Show a PageSetupDialog&quot;</span><span style="color: black;">&#41;</span>
        b.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onButton</span><span style="color: black;">&#41;</span>
&nbsp;
        sizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>b, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        panel.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span>sizer<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onButton<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        Based on the wxPython demo - sets some default values for the
        PageSetupDialog, then opens it. If the user presses OK, the
        user's choices are extracted and printed to stdout
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        data = wx.<span style="color: black;">PageSetupDialogData</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        data.<span style="color: black;">SetMarginTopLeft</span><span style="color: black;">&#40;</span> <span style="color: black;">&#40;</span><span style="color: #ff4500;">15</span>, <span style="color: #ff4500;">15</span><span style="color: black;">&#41;</span> <span style="color: black;">&#41;</span>
        data.<span style="color: black;">SetMarginBottomRight</span><span style="color: black;">&#40;</span> <span style="color: black;">&#40;</span><span style="color: #ff4500;">15</span>, <span style="color: #ff4500;">15</span><span style="color: black;">&#41;</span> <span style="color: black;">&#41;</span>
        <span style="color: #808080; font-style: italic;">#data.SetDefaultMinMargins(True)</span>
        data.<span style="color: black;">SetPaperId</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">PAPER_LETTER</span><span style="color: black;">&#41;</span>
&nbsp;
        dlg = wx.<span style="color: black;">PageSetupDialog</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, data<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> dlg.<span style="color: black;">ShowModal</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == wx.<span style="color: black;">ID_OK</span>:
            data = dlg.<span style="color: black;">GetPageSetupData</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            tl = data.<span style="color: black;">GetMarginTopLeft</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            br = data.<span style="color: black;">GetMarginBottomRight</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Margins are: %s %s<span style="color: #000099; font-weight: bold;">\n</span>'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span><span style="color: #008000;">str</span><span style="color: black;">&#40;</span>tl<span style="color: black;">&#41;</span>, <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>br<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
        dlg.<span style="color: black;">Destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
<span style="color: #808080; font-style: italic;"># Run the program</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app = wx.<span style="color: black;">App</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
    frame = MyForm<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    frame.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>Let&#8217;s take a gander at the <em>onButton</em> method. First we need to set up some defaults for the dialog, which is what the first four lines are for. Next we need to get the user&#8217;s choices, so in the conditional IF statement we see how to access a few of the settings in the dialog, such as <em>GetMarginTopLeft </em>or <em>GetMarginBottomRight</em>. You can get the other bits of information using other getters like <em>GetPaperSize</em>. Note that to get access to these methods you first have to create an object based on <em>GetPageSetupData</em>.</p>
<h2>wx.PrintDialog</h2>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/07/printDlg.png"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/07/printDlg.png" alt="" title="printDlg" width="626" height="522" class="aligncenter size-full wp-image-1024" /></a></p>
<p>The wx.PrintDialog allows the user to choose what printer to print to and give the user the normal options that he or she would see if they were to try to print something. It&#8217;s a handy wrapper around the platform&#8217;s native print dialog. Here&#8217;s how you make one:</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> wx
&nbsp;
<span style="color: #808080; font-style: italic;">########################################################################</span>
<span style="color: #ff7700;font-weight:bold;">class</span> MyForm<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>,
                          <span style="color: #483d8b;">&quot;PrintDialog Tutorial&quot;</span><span style="color: black;">&#41;</span>
        panel = wx.<span style="color: black;">Panel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, wx.<span style="color: black;">ID_ANY</span><span style="color: black;">&#41;</span>
        b = wx.<span style="color: black;">Button</span><span style="color: black;">&#40;</span>panel, label=<span style="color: #483d8b;">&quot;Create and Show a wx.PrintDialog&quot;</span><span style="color: black;">&#41;</span>
        b.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onButton</span><span style="color: black;">&#41;</span>
&nbsp;
        sizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>b, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        panel.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span>sizer<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onButton<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, evt<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        Based on the wxPython demo - Sets up a few defaults for the dialog
        before showing it modally.
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        data = wx.<span style="color: black;">PrintDialogData</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        data.<span style="color: black;">EnableSelection</span><span style="color: black;">&#40;</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
        data.<span style="color: black;">EnablePrintToFile</span><span style="color: black;">&#40;</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
        data.<span style="color: black;">EnablePageNumbers</span><span style="color: black;">&#40;</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
        data.<span style="color: black;">SetMinPage</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
        data.<span style="color: black;">SetMaxPage</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        data.<span style="color: black;">SetAllPages</span><span style="color: black;">&#40;</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
&nbsp;
        dlg = wx.<span style="color: black;">PrintDialog</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, data<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> dlg.<span style="color: black;">ShowModal</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == wx.<span style="color: black;">ID_OK</span>:
            data = dlg.<span style="color: black;">GetPrintDialogData</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'GetAllPages: %d<span style="color: #000099; font-weight: bold;">\n</span>'</span> <span style="color: #66cc66;">%</span> data.<span style="color: black;">GetAllPages</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        dlg.<span style="color: black;">Destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
<span style="color: #808080; font-style: italic;"># Run the program</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app = wx.<span style="color: black;">App</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
    frame = MyForm<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    frame.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>Much like the PageSetupDialog, we need to set up some defaults for this dialog too. Here we set up the min and max page numbers, enable print to file, etc. When you grab the user&#8217;s choices, you might want to save them and instantiate the dialog with that information so they don&#8217;t have to re-customize their print job should they want to print it again. Anyway, to actually get the user&#8217;s choices, we call the dialog&#8217;s <em>GetPrintDialogData</em> method and then use the result to query the other pieces. Our example just shows how to get all the pages that will print. You can drill down to more information by doing the following:</p>
<pre class="python">pd = data.<span style="color: black;">GetPrintData</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> pd.<span style="color: black;">Duplex</span>
<span style="color: #ff4500;">0</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> pd.<span style="color: black;">GetFilename</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
u<span style="color: #483d8b;">''</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> pd.<span style="color: black;">GetOrientation</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff4500;">1</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> pd.<span style="color: black;">GetPaperSize</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
wx.<span style="color: black;">Size</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">210</span>, <span style="color: #ff4500;">297</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> pd.<span style="color: black;">GetPrintMode</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>You&#8217;ll have to refer to the documentation for wxPython, wxWidgets or maybe even your platform to figure out what some of the results mean.</p>
<h2>wx.ProgressDialog</h2>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/07/progressDlg.png"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/07/progressDlg.png" alt="" title="progressDlg" width="263" height="229" class="aligncenter size-full wp-image-1025" /></a></p>
<p>The wx.ProgressDialog can be used to show the user how far along a download is or give the user feedback about some other long running process. You could also use the wx.Gauge or PyProgress (AGW) to give the user similar information. We&#8217;ll look at that soon, but first we&#8217;re going to check out how to create the wx.ProgressDialog:</p>
<pre class="python"><span style="color: #808080; font-style: italic;"># progressDialog.py</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> wx
&nbsp;
<span style="color: #808080; font-style: italic;">########################################################################</span>
<span style="color: #ff7700;font-weight:bold;">class</span> MyForm<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>,
                          <span style="color: #483d8b;">&quot;ProgressDialog Tutorial&quot;</span><span style="color: black;">&#41;</span>
        panel = wx.<span style="color: black;">Panel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, wx.<span style="color: black;">ID_ANY</span><span style="color: black;">&#41;</span>
        b = wx.<span style="color: black;">Button</span><span style="color: black;">&#40;</span>panel, label=<span style="color: #483d8b;">&quot;Create and Show a ProgressDialog&quot;</span><span style="color: black;">&#41;</span>
        b.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onButton</span><span style="color: black;">&#41;</span>
&nbsp;
        sizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>b, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        panel.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span>sizer<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onButton<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, evt<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        Copied from the wxPython demo
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        <span style="color: #008000;">max</span> = <span style="color: #ff4500;">80</span>
&nbsp;
        dlg = wx.<span style="color: black;">ProgressDialog</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Progress dialog example&quot;</span>,
                               <span style="color: #483d8b;">&quot;An informative message&quot;</span>,
                               maximum = <span style="color: #008000;">max</span>,
                               parent=<span style="color: #008000;">self</span>,
                               style = wx.<span style="color: black;">PD_CAN_ABORT</span>
                                | wx.<span style="color: black;">PD_APP_MODAL</span>
                                | wx.<span style="color: black;">PD_ELAPSED_TIME</span>
                                <span style="color: #808080; font-style: italic;">#| wx.PD_ESTIMATED_TIME</span>
                                | wx.<span style="color: black;">PD_REMAINING_TIME</span>
                                <span style="color: black;">&#41;</span>
&nbsp;
        keepGoing = <span style="color: #008000;">True</span>
        count = <span style="color: #ff4500;">0</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">while</span> keepGoing <span style="color: #ff7700;font-weight:bold;">and</span> count <span style="color: #66cc66;">&lt;</span> <span style="color: #008000;">max</span>:
            count += <span style="color: #ff4500;">1</span>
            wx.<span style="color: black;">MilliSleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">250</span><span style="color: black;">&#41;</span>
&nbsp;
            <span style="color: #ff7700;font-weight:bold;">if</span> count <span style="color: #66cc66;">&gt;</span>= <span style="color: #008000;">max</span> / <span style="color: #ff4500;">2</span>:
                <span style="color: black;">&#40;</span>keepGoing, skip<span style="color: black;">&#41;</span> = dlg.<span style="color: black;">Update</span><span style="color: black;">&#40;</span>count, <span style="color: #483d8b;">&quot;Half-time!&quot;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">else</span>:
                <span style="color: black;">&#40;</span>keepGoing, skip<span style="color: black;">&#41;</span> = dlg.<span style="color: black;">Update</span><span style="color: black;">&#40;</span>count<span style="color: black;">&#41;</span>
&nbsp;
        dlg.<span style="color: black;">Destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
<span style="color: #808080; font-style: italic;"># Run the program</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app = wx.<span style="color: black;">App</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
    frame = MyForm<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    frame.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>As you can see, the ProgressDialog accepts the following arguments: window caption, message, amount of time to run, parent, and various styles. We added the wx.PD_CAN_ABORT style to allow us to abort the dialog. The rest of the styles and methods are pretty self-explanatory.</p>
<h2>PyBusyInfo (AGW)</h2>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/07/pyBusyDlg.png"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/07/pyBusyDlg.png" alt="" title="pyBusyDlg" width="400" height="100" class="aligncenter size-full wp-image-1027" /></a></p>
<p>In the previous article, we covered the BusyDlg. Well, Andrea Gavana went and wrote a pure python version of that virtually unknown dialog that gives us the ability to add an image! And since it&#8217;s python, we can add other features to it quite easily. Here&#8217;s how you create one:</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> images
<span style="color: #ff7700;font-weight:bold;">import</span> wx
<span style="color: #ff7700;font-weight:bold;">import</span> wx.<span style="color: black;">lib</span>.<span style="color: black;">agw</span>.<span style="color: black;">pybusyinfo</span> as PBI
&nbsp;
<span style="color: #808080; font-style: italic;">########################################################################</span>
<span style="color: #ff7700;font-weight:bold;">class</span> MyForm<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>,
                          <span style="color: #483d8b;">&quot;PyBusyInfo Tutorial&quot;</span><span style="color: black;">&#41;</span>
        panel = wx.<span style="color: black;">Panel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, wx.<span style="color: black;">ID_ANY</span><span style="color: black;">&#41;</span>
        b = wx.<span style="color: black;">Button</span><span style="color: black;">&#40;</span>panel, label=<span style="color: #483d8b;">&quot;Test PyBusyInfo&quot;</span><span style="color: black;">&#41;</span>
        b.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onButton</span><span style="color: black;">&#41;</span>
&nbsp;
        sizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>b, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        panel.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span>sizer<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onButton<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        Based on the wxPython demo by the same name
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        event.<span style="color: black;">Skip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        message = <span style="color: #483d8b;">&quot;Please wait 5 seconds, working...&quot;</span>
        busy = PBI.<span style="color: black;">PyBusyInfo</span><span style="color: black;">&#40;</span>message, parent=<span style="color: #008000;">None</span>, title=<span style="color: #483d8b;">&quot;Really Busy&quot;</span>,
                              icon=images.<span style="color: black;">Smiles</span>.<span style="color: black;">GetBitmap</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
        wx.<span style="color: black;">Yield</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">for</span> indx <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">xrange</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>:
            wx.<span style="color: black;">MilliSleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1000</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">del</span> busy
&nbsp;
<span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
<span style="color: #808080; font-style: italic;"># Run the program</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app = wx.<span style="color: black;">App</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
    frame = MyForm<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    frame.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>Note that the <em>PyBusyInfo</em> also has an oddball method of destroying the dialog. In this case, we call python&#8217;s builtin, &#8220;del&#8221;. Hopefully Mr. Gavana will add a Destroy() method to it so the dialog can be destroyed in the standard way. Also notice how we add the icon by just passing it in with the icon parameter.</p>
<h2>PyProgress (AGW)</h2>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/07/pyProgressDlg.png"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/07/pyProgressDlg.png" alt="" title="pyProgressDlg" width="307" height="176" class="aligncenter size-full wp-image-1028" /></a></p>
<p>The <em>PyProgress </em> dialog comes to us courtesy of the industrious Andrea Gavana. Yes, it&#8217;s another AGW library widget, which means it&#8217;s also pure python. It looks a little different than the wx.ProgressDialog. Hopefully you&#8217;ll like its aesthetics too. Let&#8217;s find out how to make one of our own:</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> images
<span style="color: #ff7700;font-weight:bold;">import</span> wx
<span style="color: #ff7700;font-weight:bold;">import</span> wx.<span style="color: black;">lib</span>.<span style="color: black;">agw</span>.<span style="color: black;">pyprogress</span> as PP
&nbsp;
<span style="color: #808080; font-style: italic;">########################################################################</span>
<span style="color: #ff7700;font-weight:bold;">class</span> MyForm<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>,
                          <span style="color: #483d8b;">&quot;PyBusyInfo Tutorial&quot;</span><span style="color: black;">&#41;</span>
        panel = wx.<span style="color: black;">Panel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, wx.<span style="color: black;">ID_ANY</span><span style="color: black;">&#41;</span>
        b = wx.<span style="color: black;">Button</span><span style="color: black;">&#40;</span>panel, label=<span style="color: #483d8b;">&quot;Test PyBusyInfo&quot;</span><span style="color: black;">&#41;</span>
        b.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onButton</span><span style="color: black;">&#41;</span>
&nbsp;
        sizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>b, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        panel.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span>sizer<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onButton<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        Based on the wxPython demo by the same name
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        event.<span style="color: black;">Skip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        style = wx.<span style="color: black;">PD_APP_MODAL</span>|wx.<span style="color: black;">PD_ELAPSED_TIME</span>|wx.<span style="color: black;">PD_CAN_ABORT</span>
        dlg = PP.<span style="color: black;">PyProgress</span><span style="color: black;">&#40;</span><span style="color: #008000;">None</span>, <span style="color: #ff4500;">-1</span>, <span style="color: #483d8b;">&quot;PyProgress Example&quot;</span>,
                            <span style="color: #483d8b;">&quot;An Informative Message&quot;</span>,
                            style=style<span style="color: black;">&#41;</span>
        <span style="color: #008000;">max</span> = <span style="color: #ff4500;">400</span>
        keepGoing = <span style="color: #008000;">True</span>
        count = <span style="color: #ff4500;">0</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">while</span> keepGoing <span style="color: #ff7700;font-weight:bold;">and</span> count <span style="color: #66cc66;">&lt;</span> <span style="color: #008000;">max</span>:
            count += <span style="color: #ff4500;">1</span>
            wx.<span style="color: black;">MilliSleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">30</span><span style="color: black;">&#41;</span>
&nbsp;
            <span style="color: #ff7700;font-weight:bold;">if</span> count <span style="color: #66cc66;">&gt;</span>= <span style="color: #008000;">max</span> / <span style="color: #ff4500;">2</span>:
                keepGoing = dlg.<span style="color: black;">UpdatePulse</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Half-time!&quot;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">else</span>:
                keepGoing = dlg.<span style="color: black;">UpdatePulse</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        dlg.<span style="color: black;">Destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        wx.<span style="color: black;">SafeYield</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        wx.<span style="color: black;">GetApp</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">GetTopWindow</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">Raise</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
<span style="color: #808080; font-style: italic;"># Run the program</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app = wx.<span style="color: black;">App</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
    frame = MyForm<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    frame.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>The code above is pretty much like all the other dialogs we&#8217;ve seen so far. Just for fun, I&#8217;ll let you figure out how this one works. </p>
<h2>ScrolledMessageDialog</h2>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/07/scrolledMsgDlg.png"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/07/scrolledMsgDlg.png" alt="" title="scrolledMsgDlg" width="512" height="312" class="aligncenter size-full wp-image-1030" /></a></p>
<p>The ScrolledMessageDialog is one of the few generic dialogs that Andrea Gavana didn&#8217;t write. It&#8217;s also one of the easiest to create and use. Don&#8217;t believe me? Well, read the code below and see how wrong you are!</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> wx
<span style="color: #ff7700;font-weight:bold;">import</span> wx.<span style="color: black;">lib</span>.<span style="color: black;">dialogs</span>
&nbsp;
<span style="color: #808080; font-style: italic;">########################################################################</span>
<span style="color: #ff7700;font-weight:bold;">class</span> MyForm<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>,
                          <span style="color: #483d8b;">&quot;ScrolledMessageDialog Tutorial&quot;</span><span style="color: black;">&#41;</span>
        panel = wx.<span style="color: black;">Panel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, wx.<span style="color: black;">ID_ANY</span><span style="color: black;">&#41;</span>
        b = wx.<span style="color: black;">Button</span><span style="color: black;">&#40;</span>panel, label=<span style="color: #483d8b;">&quot;Create and Show a ScrolledMessageDialog&quot;</span><span style="color: black;">&#41;</span>
        b.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onButton</span><span style="color: black;">&#41;</span>
&nbsp;
        sizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>b, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        panel.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span>sizer<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onButton<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        Based on the wxPython demo by the same name
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        f = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;imageDialog.py&quot;</span>, <span style="color: #483d8b;">&quot;r&quot;</span><span style="color: black;">&#41;</span>
        msg = f.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        f.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        dlg = wx.<span style="color: black;">lib</span>.<span style="color: black;">dialogs</span>.<span style="color: black;">ScrolledMessageDialog</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, msg, <span style="color: #483d8b;">&quot;message test&quot;</span><span style="color: black;">&#41;</span>
        dlg.<span style="color: black;">ShowModal</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        dlg.<span style="color: black;">Destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
<span style="color: #808080; font-style: italic;"># Run the program</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app = wx.<span style="color: black;">App</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
    frame = MyForm<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    frame.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>As you can clearly see, all you need is some text to pass to the dialog. In this case, we read one of the other python files and passed it to the dialog. I hope you&#8217;ve been paying attention to the special imports we&#8217;ve had to do for these generic dialogs. For this one, we had to import <em>wx.lib.dialogs</em> to gain access to the <em>ScrolledMessageDialog</em>.</p>
<h2>wx.SingleChoiceDialog</h2>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/07/singleChoiceDlg.png"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/07/singleChoiceDlg.png" alt="" title="singleChoiceDlg" width="348" height="351" class="aligncenter size-full wp-image-1032" /></a></p>
<p>Sometimes you want to give the user a list of items, but only allow him to select one. You could use a custom wx.Dialog with a set of radio buttons or you could use the <em>wx.SingleChoiceDialog</em>. In case you didn&#8217;t guess, we&#8217;re going with the latter&#8230;</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> wx
&nbsp;
<span style="color: #808080; font-style: italic;">########################################################################</span>
<span style="color: #ff7700;font-weight:bold;">class</span> MyForm<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>,
                          <span style="color: #483d8b;">&quot;SingleChoiceDialog Tutorial&quot;</span><span style="color: black;">&#41;</span>
        panel = wx.<span style="color: black;">Panel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, wx.<span style="color: black;">ID_ANY</span><span style="color: black;">&#41;</span>
        b = wx.<span style="color: black;">Button</span><span style="color: black;">&#40;</span>panel, label=<span style="color: #483d8b;">&quot;Create and Show a SingleChoiceDialog&quot;</span><span style="color: black;">&#41;</span>
        b.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onButton</span><span style="color: black;">&#41;</span>
&nbsp;
        sizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>b, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        panel.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span>sizer<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onButton<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        Based on the wxPython demo by the same name
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        dlg = wx.<span style="color: black;">SingleChoiceDialog</span><span style="color: black;">&#40;</span>
                <span style="color: #008000;">self</span>, <span style="color: #483d8b;">&quot;What's your favorite langauge?&quot;</span>, <span style="color: #483d8b;">'The Caption'</span>,
                <span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;C++&quot;</span>, <span style="color: #483d8b;">&quot;VB&quot;</span>, <span style="color: #483d8b;">&quot;Python&quot;</span>, <span style="color: #483d8b;">&quot;Perl&quot;</span>, <span style="color: #483d8b;">&quot;Ruby&quot;</span>, <span style="color: #483d8b;">&quot;FoxPro&quot;</span><span style="color: black;">&#93;</span>,
                wx.<span style="color: black;">CHOICEDLG_STYLE</span>
                <span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> dlg.<span style="color: black;">ShowModal</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == wx.<span style="color: black;">ID_OK</span>:
            <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'You selected: %s<span style="color: #000099; font-weight: bold;">\n</span>'</span> <span style="color: #66cc66;">%</span> dlg.<span style="color: black;">GetStringSelection</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        dlg.<span style="color: black;">Destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
<span style="color: #808080; font-style: italic;"># Run the program</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app = wx.<span style="color: black;">App</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
    frame = MyForm<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    frame.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>Here the <em>SingleChoiceDialog</em> accepts most of the same arguments that the other dialogs have taken. Take note that we need to pass a list in to create the list of choices and the wx.CHOICEDLG_STYLE style to make the dialog function correctly. Other than that, we&#8217;ve been there, done that.</p>
<h2>wx.TextEntryDialog</h2>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/07/textEntryDlg.png"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/07/textEntryDlg.png" alt="" title="textEntryDlg" width="348" height="165" class="aligncenter size-full wp-image-1034" /></a></p>
<p>The <em>wx.TextEntryDialog</em> gives us the ability to allow the user to tell us whatever he wants. Yes, that is scary, but sometimes you just have to do it. You might use this dialog to get non-specific comments or feedback from your venerable users. Here&#8217;s how you can do it:</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> wx
&nbsp;
<span style="color: #808080; font-style: italic;">########################################################################</span>
<span style="color: #ff7700;font-weight:bold;">class</span> MyForm<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>,
                          <span style="color: #483d8b;">&quot;TextEntryDialog Tutorial&quot;</span><span style="color: black;">&#41;</span>
        panel = wx.<span style="color: black;">Panel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, wx.<span style="color: black;">ID_ANY</span><span style="color: black;">&#41;</span>
        b = wx.<span style="color: black;">Button</span><span style="color: black;">&#40;</span>panel, label=<span style="color: #483d8b;">&quot;Create and Show a TextEntryDialog&quot;</span><span style="color: black;">&#41;</span>
        b.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onButton</span><span style="color: black;">&#41;</span>
&nbsp;
        sizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>b, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        panel.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span>sizer<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onButton<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        Based on the wxPython demo by the same name
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        dlg = wx.<span style="color: black;">TextEntryDialog</span><span style="color: black;">&#40;</span>
                <span style="color: #008000;">self</span>, <span style="color: #483d8b;">'What is your favorite programming language?'</span>,
                <span style="color: #483d8b;">'Eh??'</span>, <span style="color: #483d8b;">'Python'</span><span style="color: black;">&#41;</span>
&nbsp;
        dlg.<span style="color: black;">SetValue</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Python is the best!&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> dlg.<span style="color: black;">ShowModal</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == wx.<span style="color: black;">ID_OK</span>:
            <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;you accepted!&quot;</span>
        dlg.<span style="color: black;">Destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
<span style="color: #808080; font-style: italic;"># Run the program</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app = wx.<span style="color: black;">App</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
    frame = MyForm<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    frame.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>Here we see that the dialogs arguments include the following: parent, message, caption, defaultValue. Of course, we override the defaultValue when we call the dialog&#8217;s <em>SetValue()</em> method. The rest of the code should look familiar. </p>
<h2>Wrapping up</h2>
<p>If you made it this far, congratulations! You just slogged through one of the longest posts ever written on this site! You should now be an expert in wxPython dialogs. If you want even more information, feel free to read the many references below to continue your education. And get out there and start using these dialogs to great effect!</p>
<p><em>Note: I didn&#8217;t use anything other than the wxPython demo, Wingware&#8217;s IDE and few documentation pages in writing this article.</em></p>
<h2>Additional Reading</h2>
<ul>
<li>GenericMessageDialog &#8211; <a href="http://www.wxpython.org/docs/api/wx.lib.agw.genericmessagedialog-module.html">Official documentation </a>, <a href="http://xoomer.virgilio.it/infinity77/AGW_Docs/genericmessagedialog_module.html">Gavana&#8217;s Docs</a>, something with the same name from the <a href="http://wiki.wxpython.org/GenericMessageDialog">wxPython Wiki</a></li>
<li>ImageDialog &#8211; <a href="http://www.wxpython.org/docs/api/wx.lib.imagebrowser.ImageDialog-class.html">Official documentation</a>, some <a href="http://www.java2s.com/Tutorial/Python/0380__wxPython/useImageDialog.htm">java site</a></li>
<li>wx.MultiChoiceDialog &#8211; <a href="http://www.wxpython.org/docs/api/wx.MultiChoiceDialog-class.html">Official documentation</a></li>
<li>wx.PageSetupDialog &#8211; <a href="http://www.wxpython.org/docs/api/wx.PageSetupDialog-class.html">Official documentation</a>, Andrea Gavana&#8217;s <a href="http://xoomer.virgilio.it/infinity77/wxPython/Widgets/wx.PageSetupDialog.html">documentation </a>for this widget</li>
<li>wx.PrintDialog &#8211; <a href="http://www.wxpython.org/docs/api/wx.PrintDialog-class.html">Official documentation</a>, <a href="http://wiki.wxpython.org/Printing">printing wiki page</a></li>
<li>wx.ProgressDialog &#8211; <a href="http://www.wxpython.org/docs/api/wx.ProgressDialog-class.html">Official documentation</a></li>
<li>PyBusyInfo &#8211; <a href="http://xoomer.virgilio.it/infinity77/AGW_Docs/pybusyinfo_module.html">Andrea Gavana&#8217;s Docs</a></li>
<li>PyProgress &#8211; <a href="http://www.wxpython.org/docs/api/wx.lib.agw.pyprogress-module.html">Official documentation</a>, <a href="http://xoomer.virgilio.it/infinity77/AGW_Docs/pyprogress_module.html">Andrea Gavana&#8217;s docs</a></li>
<li>ScrolledMessageDialog &#8211; <a href="http://www.wxpython.org/docs/api/wx.lib.dialogs.ScrolledMessageDialog-class.html">Official documentation</a>, wiki <a href="http://wiki.wxpython.org/MessageBoxes">example</a></li>
<li>wx.SingleChoiceDialog &#8211; <a href="http://www.wxpython.org/docs/api/wx.SingleChoiceDialog-class.html">Official documentation</a></li>
<li>wx.TextEntryDialog &#8211; <a href="http://www.wxpython.org/docs/api/wx.TextEntryDialog-class.html">Official documentation</a></li>
</ul>
<h2>More Reading</h2>
<ul>
<li>The first part of this <a href="http://www.blog.pythonlibrary.org/2010/06/26/the-dialogs-of-wxpython-part-1-of-2/">series</a></li>
<li>Devshed&#8217;s <a href="http://www.devshed.com/c/a/Python/Dialogs-in-wxPython/">dialog article</a></li>
<li>SciPy&#8217;s dialog <a href="http://www.scipy.org/Cookbook/wxPython_dialogs">cookbook page</a></li>
<li>Zetcode&#8217;s <a href="http://zetcode.com/wxpython/dialogs/">dialog article</a></li>
</ul>
<h2>Downloads</h2>
<ul>
<li><a href='http://www.blog.pythonlibrary.org/wp-content/uploads/2010/07/dialogs_part_two.zip'>dialogs_part_two.zip</a></li>
<li><a href='http://www.blog.pythonlibrary.org/wp-content/uploads/2010/07/dialogs_part_two.tar'>dialogs_part_two.tar</a></li>
</ul>
<p><strong>Note: This code was tested on the following:</strong></p>
<ul>
<li>Windows XP Professional, wxPython 2.8.10.1 / 2.8.11.0, Python 2.5</li>
<li>Windows 7 Home Edition, wxPython 2.8.10.1, Python 2.6</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.blog.pythonlibrary.org/2010/07/10/the-dialogs-of-wxpython-part-2-of-2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>wxPython and PubSub: A Simple Tutorial</title>
		<link>http://www.blog.pythonlibrary.org/2010/06/27/wxpython-and-pubsub-a-simple-tutorial/</link>
		<comments>http://www.blog.pythonlibrary.org/2010/06/27/wxpython-and-pubsub-a-simple-tutorial/#comments</comments>
		<pubDate>Sun, 27 Jun 2010 22:42:07 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[wxPython]]></category>
		<category><![CDATA[IPC]]></category>
		<category><![CDATA[pubsub]]></category>

		<guid isPermaLink="false">http://www.blog.pythonlibrary.org/?p=920</guid>
		<description><![CDATA[I see a number of questions on the wxPython mailing list or its IRC channel about communicating between frames and most of the time what the developer needs is the PubSub module. The Publisher / Subscriber model is a way to send messages to one or more listeners. You can read about it here. The [...]]]></description>
			<content:encoded><![CDATA[<p>I see a number of questions on the wxPython mailing list or its IRC channel about communicating between frames and most of the time what the developer needs is the PubSub module. The Publisher / Subscriber model is a way to send messages to one or more listeners. You can read about it <a href="http://en.wikipedia.org/wiki/Publish/subscribe">here</a>. The <a href="http://en.wikipedia.org/wiki/Observer_pattern">Observer pattern</a> is said to be based on the Publish / Subscribe pattern. In wxPython land, we have the pubsub module which can be accessed from wx.lib.pubsub. It&#8217;s actually included in wxPython, but you can also download it as a standalone module from its <a href="http://pubsub.sourceforge.net/">Source Forge</a>. An alternative to pubsub is the <a href="http://pypi.python.org/pypi/PyDispatcher/2.0.1">PyDispatcher </a>module. </p>
<p>Anyway, in this article we won&#8217;t be studying the theory behind either of these modules. Instead, we&#8217;ll use a semi-practical example in wxPython to show how to use the built-in version of pubsub to communicate between two frames. If you&#8217;re still with me at this point, then I encourage you to read on!<span id="more-920"></span></p>
<h2>How to Pass Information Between Two Frames</h2>
<p>I&#8217;ve found that sometimes I need to open a non-modal frame to get information from a user and then pass that information back to my application&#8217;s main frame. Other times, I need to just tell one of my frames that the other one has closed. In these two cases, pubsub comes riding to the rescue. The following example will actually demonstrate a solution to both of these issues.</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> wx
<span style="color: #ff7700;font-weight:bold;">from</span> wx.<span style="color: black;">lib</span>.<span style="color: black;">pubsub</span> <span style="color: #ff7700;font-weight:bold;">import</span> Publisher
&nbsp;
<span style="color: #808080; font-style: italic;">########################################################################</span>
<span style="color: #ff7700;font-weight:bold;">class</span> OtherFrame<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;Constructor&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>, <span style="color: #483d8b;">&quot;Secondary Frame&quot;</span><span style="color: black;">&#41;</span>
        panel = wx.<span style="color: black;">Panel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
&nbsp;
        msg = <span style="color: #483d8b;">&quot;Enter a Message to send to the main frame&quot;</span>
        instructions = wx.<span style="color: black;">StaticText</span><span style="color: black;">&#40;</span>panel, label=msg<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">msgTxt</span> = wx.<span style="color: black;">TextCtrl</span><span style="color: black;">&#40;</span>panel, value=<span style="color: #483d8b;">&quot;&quot;</span><span style="color: black;">&#41;</span>
        closeBtn = wx.<span style="color: black;">Button</span><span style="color: black;">&#40;</span>panel, label=<span style="color: #483d8b;">&quot;Send and Close&quot;</span><span style="color: black;">&#41;</span>
        closeBtn.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onSendAndClose</span><span style="color: black;">&#41;</span>
&nbsp;
        sizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        flags = wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">CENTER</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>instructions, <span style="color: #ff4500;">0</span>, flags, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">msgTxt</span>, <span style="color: #ff4500;">0</span>, flags, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>closeBtn, <span style="color: #ff4500;">0</span>, flags, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        panel.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span>sizer<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onSendAndClose<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        Send a message and close frame
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        msg = <span style="color: #008000;">self</span>.<span style="color: black;">msgTxt</span>.<span style="color: black;">GetValue</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        Publisher<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">sendMessage</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;show.mainframe&quot;</span><span style="color: black;">&#41;</span>, msg<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">Close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;">########################################################################</span>
<span style="color: #ff7700;font-weight:bold;">class</span> MainPanel<span style="color: black;">&#40;</span>wx.<span style="color: black;">Panel</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, parent<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;Constructor&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        wx.<span style="color: black;">Panel</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, parent=parent<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">frame</span> = parent
&nbsp;
        Publisher<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">subscribe</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">showFrame</span>, <span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;show.mainframe&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">pubsubText</span> = wx.<span style="color: black;">TextCtrl</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, value=<span style="color: #483d8b;">&quot;&quot;</span><span style="color: black;">&#41;</span>
        hideBtn = wx.<span style="color: black;">Button</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, label=<span style="color: #483d8b;">&quot;Hide&quot;</span><span style="color: black;">&#41;</span>
        hideBtn.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">hideFrame</span><span style="color: black;">&#41;</span>
&nbsp;
        sizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">pubsubText</span>, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>hideBtn, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span>sizer<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> hideFrame<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">frame</span>.<span style="color: black;">Hide</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        new_frame = OtherFrame<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        new_frame.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> showFrame<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, msg<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        Shows the frame and shows the message sent in the
        text control
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">pubsubText</span>.<span style="color: black;">SetValue</span><span style="color: black;">&#40;</span>msg.<span style="color: black;">data</span><span style="color: black;">&#41;</span>
        frame = <span style="color: #008000;">self</span>.<span style="color: black;">GetParent</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        frame.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">########################################################################</span>
<span style="color: #ff7700;font-weight:bold;">class</span> MainFrame<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>, <span style="color: #483d8b;">&quot;Pubsub Tutorial&quot;</span><span style="color: black;">&#41;</span>
        panel = MainPanel<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app = wx.<span style="color: black;">App</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
    frame = MainFrame<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    frame.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>Our first stop in the tour of this code is in the MainPanel class. Take note of the following line:</p>
<pre class="python">Publisher<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">subscribe</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">showFrame</span>, <span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;show.mainframe&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre>
<p>This creates a listener singleton (AKA: a receiver) that subscribes to the &#8220;show.mainframe&#8221; topic. Other parts of the program can publish to that topic and the listen will pick them up and call the &#8220;showFrame&#8221; method. To see this in action, check out the &#8220;OtherFrame&#8221; classe&#8217;s &#8220;onSendAndClose&#8221; method.</p>
<pre class="python"><span style="color: #808080; font-style: italic;"># OtherFrame Class</span>
<span style="color: #ff7700;font-weight:bold;">def</span> onSendAndClose<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
    Send a message and close frame
    &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
    msg = <span style="color: #008000;">self</span>.<span style="color: black;">msgTxt</span>.<span style="color: black;">GetValue</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    Publisher<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">sendMessage</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;show.mainframe&quot;</span><span style="color: black;">&#41;</span>, msg<span style="color: black;">&#41;</span>
    <span style="color: #008000;">self</span>.<span style="color: black;">Close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>Here we grab the text control&#8217;s value to send back to our main frame. To send it, we call the <em>Publisher </em>object&#8217;s <em>sendMessage </em>method and pass it the topic string and the message. The message can be a list of objects or just a single object. In this case, it&#8217;s just a string. Back in the <em>MainPanel</em>, the <em>showFrame </em>method gets called. Here&#8217;s what that looks like:</p>
<pre class="python"><span style="color: #808080; font-style: italic;"># MainPanel class</span>
<span style="color: #ff7700;font-weight:bold;">def</span> showFrame<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, msg<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
    Shows the frame and shows the message sent in the
    text control
    &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
    <span style="color: #008000;">self</span>.<span style="color: black;">pubsubText</span>.<span style="color: black;">SetValue</span><span style="color: black;">&#40;</span>msg.<span style="color: black;">data</span><span style="color: black;">&#41;</span>
    frame = <span style="color: #008000;">self</span>.<span style="color: black;">GetParent</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    frame.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>In this method we extract the data sent through pubsub via its <em>data</em> property. If we had sent multiple items using a list, we&#8217;d need to do something like msg.data[0] to get at the right item (assuming the string was in element one). The newest pubsub has a slightly different API which you can check out in its <a href="http://pubsub.sourceforge.net/recipes/upgrade_v1tov3.html">cookbook</a>. The newest API is available as of wxPython 2.8.11.0.  <em>Note: I had some trouble creating a binary with the newest pubsub because I was using a slightly older API. See this <a href="http://groups.google.com/group/wxpython-users/browse_thread/thread/d448a42abdae3e69/318cc65f2b54348f?lnk=gst&#038;q=pubsub#318cc65f2b54348f">thread </a>for details and for some possible workarounds.</em></p>
<p>Now you know the basics of using pubsub in your project. This example shows how to communicate between two frames even when one is hidden! It also shows how to pass information from one frame to the other. Have fun!</p>
<h2>Additional Reading</h2>
<ul>
<li><a href="http://www.blog.pythonlibrary.org/2010/03/26/creating-a-simple-photo-viewer-with-wxpython/">Creating a Simple Photo Viewer</a></li>
<li><a href="http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/">wxPython and Threads</a></li>
<li><a href="http://wiki.wxpython.org/PubSub">Pubsub wxPython wiki page</a></li>
<li>Official PubSub <a href="http://pubsub.sourceforge.net/index.html">home page</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.blog.pythonlibrary.org/2010/06/27/wxpython-and-pubsub-a-simple-tutorial/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The Dialogs of wxPython (Part 1 of 2)</title>
		<link>http://www.blog.pythonlibrary.org/2010/06/26/the-dialogs-of-wxpython-part-1-of-2/</link>
		<comments>http://www.blog.pythonlibrary.org/2010/06/26/the-dialogs-of-wxpython-part-1-of-2/#comments</comments>
		<pubDate>Sat, 26 Jun 2010 13:36:52 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[wxPython]]></category>
		<category><![CDATA[Dialogs]]></category>

		<guid isPermaLink="false">http://www.blog.pythonlibrary.org/?p=954</guid>
		<description><![CDATA[Dialogs are an integral part of user interface design. We use them all the time. We find dialogs everywhere, in many shapes and sizes. In this article we will cover the following dialog types: wx.BusyInfo wx.ColourDialog CubeColourDialog (AGW) wx.DirDialog and MultiDirDialog (AGW) wx.FileDialog wx.FontDialog wx.MessageDialog That&#8217;s a lot of dialogs, but there&#8217;s still eight more [...]]]></description>
			<content:encoded><![CDATA[<p>Dialogs are an integral part of user interface design. We use them all the time. We find dialogs everywhere, in many shapes and sizes. In this article we will cover the following dialog types:</p>
<ul>
<li>wx.BusyInfo</li>
<li>wx.ColourDialog</li>
<li>CubeColourDialog (AGW)</li>
<li>wx.DirDialog and MultiDirDialog (AGW)</li>
<li>wx.FileDialog</li>
<li>wx.FontDialog</li>
<li>wx.MessageDialog</li>
</ul>
<p>That&#8217;s a lot of dialogs, but there&#8217;s still eight more in the wxPython demo. We&#8217;ll look at those next time. For now, let&#8217;s take a look at this list!<span id="more-954"></span></p>
<h2>wx.BusyInfo &#8211; Letting the User Know You&#8217;re Busy</h2>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/busyInfo.jpg"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/busyInfo.jpg" alt="" title="busyInfo" width="406" height="87" class="aligncenter size-full wp-image-968" /></a></p>
<p>The BusyInfo dialog is not well known. For some reason, it doesn&#8217;t even have a demo in the wxPython Demo application. So for your viewing pleasure, we will create one now.</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span>
<span style="color: #ff7700;font-weight:bold;">import</span> wx
&nbsp;
<span style="color: #808080; font-style: italic;">########################################################################</span>
<span style="color: #ff7700;font-weight:bold;">class</span> MyForm<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>,
                          <span style="color: #483d8b;">&quot;BusyDialog Tutorial&quot;</span><span style="color: black;">&#41;</span>
        panel = wx.<span style="color: black;">Panel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, wx.<span style="color: black;">ID_ANY</span><span style="color: black;">&#41;</span>
&nbsp;
        busyBtn = wx.<span style="color: black;">Button</span><span style="color: black;">&#40;</span>panel, label=<span style="color: #483d8b;">&quot;Show Busy Dialog&quot;</span><span style="color: black;">&#41;</span>
        busyBtn.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onBusy</span><span style="color: black;">&#41;</span>
&nbsp;
        sizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>busyBtn, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        panel.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span>sizer<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onBusy<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">Hide</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        msg = <span style="color: #483d8b;">&quot;Please wait while we process your request...&quot;</span>
        busyDlg = wx.<span style="color: black;">BusyInfo</span><span style="color: black;">&#40;</span>msg<span style="color: black;">&#41;</span>
        <span style="color: #dc143c;">time</span>.<span style="color: black;">sleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        busyDlg = <span style="color: #008000;">None</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Run the program</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app = wx.<span style="color: black;">App</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
    frame = MyForm<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    frame.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>Fortunately, the <a href="http://www.wxpython.org/docs/api/wx.BusyInfo-class.html">BusyInfo</a> dialog is also one of the easiest dialogs to create. All you need to do is instantiate it with a string. Instead of destroying it, the common method of closing this dialog is to just set the instance to None. It&#8217;s kind of weird, but it works just fine. You can also Destroy it if need be, but I&#8217;ve never needed to nor seen an example of anyone else doing so.</p>
<h2>Choosing Colors with wx.ColourDialog and CubeColourDialog</h2>
<p>You get two color chooser dialogs with your wxPython distribution. The first one that we&#8217;ll look at is the native dialog, wx.ColourDialog. Here&#8217;s a screenshot of what <strong>wx.ColourDialog</strong> looks like on Windows XP:</p>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/wxColourDialog.jpg"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/wxColourDialog.jpg" alt="" title="wxColourDialog" width="222" height="324" class="aligncenter size-full wp-image-975" /></a></p>
<p>For this example, we&#8217;ll create a simple two-button form that can open both types of color dialogs. Let&#8217;s take a look at it:</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> wx
<span style="color: #ff7700;font-weight:bold;">import</span> wx.<span style="color: black;">lib</span>.<span style="color: black;">agw</span>.<span style="color: black;">cubecolourdialog</span> as CCD
&nbsp;
<span style="color: #808080; font-style: italic;">########################################################################</span>
<span style="color: #ff7700;font-weight:bold;">class</span> MyForm<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>,
                          <span style="color: #483d8b;">&quot;File and Folder Dialogs Tutorial&quot;</span><span style="color: black;">&#41;</span>
        panel = wx.<span style="color: black;">Panel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, wx.<span style="color: black;">ID_ANY</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">colourData</span> = <span style="color: #008000;">None</span>
&nbsp;
        colorDlgBtn = wx.<span style="color: black;">Button</span><span style="color: black;">&#40;</span>panel, label=<span style="color: #483d8b;">&quot;Open ColorDialog&quot;</span><span style="color: black;">&#41;</span>
        colorDlgBtn.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onColorDlg</span><span style="color: black;">&#41;</span>
        colorCubeBtn = wx.<span style="color: black;">Button</span><span style="color: black;">&#40;</span>panel, label=<span style="color: #483d8b;">&quot;Open ColorCubeDialog&quot;</span><span style="color: black;">&#41;</span>
        colorCubeBtn.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onCubeColorDialog</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># put the buttons in a sizer</span>
        sizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>colorDlgBtn, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>colorCubeBtn, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        panel.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span>sizer<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onColorDlg<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        This is mostly from the wxPython Demo!
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        dlg = wx.<span style="color: black;">ColourDialog</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># Ensure the full colour dialog is displayed, </span>
        <span style="color: #808080; font-style: italic;"># not the abbreviated version.</span>
        dlg.<span style="color: black;">GetColourData</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">SetChooseFull</span><span style="color: black;">&#40;</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> dlg.<span style="color: black;">ShowModal</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == wx.<span style="color: black;">ID_OK</span>:
            data = dlg.<span style="color: black;">GetColourData</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'You selected: %s<span style="color: #000099; font-weight: bold;">\n</span>'</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>data.<span style="color: black;">GetColour</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">Get</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
        dlg.<span style="color: black;">Destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onCubeColorDialog<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        This is mostly from the wxPython Demo!
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">colourData</span>.<span style="color: black;">SetColour</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">GetBackgroundColour</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
        dlg = CCD.<span style="color: black;">CubeColourDialog</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">self</span>.<span style="color: black;">colourData</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> dlg.<span style="color: black;">ShowModal</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == wx.<span style="color: black;">ID_OK</span>:
&nbsp;
            <span style="color: #808080; font-style: italic;"># If the user selected OK, then the dialog's wx.ColourData will</span>
            <span style="color: #808080; font-style: italic;"># contain valid information. Fetch the data ...</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">colourData</span> = dlg.<span style="color: black;">GetColourData</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            h, s, v, a = dlg.<span style="color: black;">GetHSVAColour</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
            <span style="color: #808080; font-style: italic;"># ... then do something with it. The actual colour data will be</span>
            <span style="color: #808080; font-style: italic;"># returned as a three-tuple (r, g, b) in this particular case.</span>
            colour = <span style="color: #008000;">self</span>.<span style="color: black;">colourData</span>.<span style="color: black;">GetColour</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">SetBackgroundColour</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">colourData</span>.<span style="color: black;">GetColour</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">Refresh</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        dlg.<span style="color: black;">Destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
<span style="color: #808080; font-style: italic;"># Run the program</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app = wx.<span style="color: black;">App</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
    frame = MyForm<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    frame.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>As you can see, the wx.ColourDialog is very easy to instantiate (see the <em>onColorDlg </em>method). All you need to do is call the dialog. The wxPython demo also included a line that showed how to display the full color version of the dialog, so we have included that line (and the comments) in this example: dlg.GetColourData().SetChooseFull(True). Finally, we call the dialog&#8217;s <em>ShowModal </em>method to show the dialog. To get the user&#8217;s color choice, we follow a two-step process. First we grab all color data using <em>data = dlg.GetColourData()</em>. Then to get the specific color, we call our data object&#8217;s<em> GetColour().Get()</em> methods.</p>
<p>Now let&#8217;s look at what the <a href="http://xoomer.virgilio.it/infinity77/AGW_Docs/cubecolourdialog.CubeColourDialog.html">CubeColourDialog </a>looks like on Windows XP:</p>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/cubeColourDlg.jpg"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/cubeColourDlg.jpg" alt="" title="cubeColourDlg" width="400" height="257" class="aligncenter size-full wp-image-979" /></a></p>
<p><em>Note: You may receive an error related to setting the alpha if you are not using wxPython 2.8.11.0 or the SVN version of this widget.</em></p>
<p>The CubeColourDialog is written in pure python rather than being a C++ widget that&#8217;s been wrapped with <a href="http://www.swig.org/">SWIG</a>. This makes the CubeColourDialog easier to edit and enhance. Let&#8217;s take a look at the code from the onCubeColorDialog method that we used above:</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">def</span> onCubeColorDialog<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
    This is mostly from the wxPython Demo!
    &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
&nbsp;
    <span style="color: #008000;">self</span>.<span style="color: black;">colourData</span>.<span style="color: black;">SetColour</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">GetBackgroundColour</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
    dlg = CCD.<span style="color: black;">CubeColourDialog</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">self</span>.<span style="color: black;">colourData</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> dlg.<span style="color: black;">ShowModal</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == wx.<span style="color: black;">ID_OK</span>:
&nbsp;
        <span style="color: #808080; font-style: italic;"># If the user selected OK, then the dialog's wx.ColourData will</span>
        <span style="color: #808080; font-style: italic;"># contain valid information. Fetch the data ...</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">colourData</span> = dlg.<span style="color: black;">GetColourData</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        h, s, v, a = dlg.<span style="color: black;">GetHSVAColour</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># ... then do something with it. The actual colour data will be</span>
        <span style="color: #808080; font-style: italic;"># returned as a three-tuple (r, g, b) in this particular case.</span>
        colour = <span style="color: #008000;">self</span>.<span style="color: black;">colourData</span>.<span style="color: black;">GetColour</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">SetBackgroundColour</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">colourData</span>.<span style="color: black;">GetColour</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">Refresh</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    dlg.<span style="color: black;">Destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>First off, we set the colourData variable to the parent widget&#8217;s background color. I&#8217;m not really sure why we do that, but I assume it&#8217;s because we want the dialog to match its parent&#8217;s color. Next create an instance of the dialog and show it. If the user presses the OK button, then we get the color that they chose. Note that we can get the hue, saturation, brightness, alpha components of the color chosen by calling the dialog&#8217;s <em>GetHSVAColour</em> method. We don&#8217;t actually use that information in this example, but it may be handy in your application. To actually get the color chosen, we just use the aptly named GetColour() method from our updated colourData instance. Finally, we set the background of our application to the newly chosen color. Neat, huh?</p>
<p>There&#8217;s also another pure python color chooser called the <a href="http://www.wxpython.org/docs/api/wx.lib.colourchooser.pycolourchooser.PyColourChooser-class.html">PyColourChooser</a>. However, it&#8217;s not a self-contained dialog, so we won&#8217;t be covering it here.</p>
<h2>Opening Files and Folders with wx.FileDialog, wx.DirDialog and MultiDirDialog (AGW)</h2>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/fileDirDlg.png"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/fileDirDlg.png" alt="" title="fileDirDlg" width="400" height="250" class="aligncenter size-full wp-image-986" /></a></p>
<p>Opening files and folders with wxPython is a breeze! It includes wrappers for the native dialogs and also includes a pure python implementation for selecting multiple folders (i.e. directories) at the same time. Let&#8217;s take a look at the sample code first and then we&#8217;ll go over the specifics for each dialog.</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>
<span style="color: #ff7700;font-weight:bold;">import</span> wx
<span style="color: #ff7700;font-weight:bold;">import</span> wx.<span style="color: black;">lib</span>.<span style="color: black;">agw</span>.<span style="color: black;">multidirdialog</span> as MDD
&nbsp;
wildcard = <span style="color: #483d8b;">&quot;Python source (*.py)|*.py|&quot;</span> \
            <span style="color: #483d8b;">&quot;All files (*.*)|*.*&quot;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">########################################################################</span>
<span style="color: #ff7700;font-weight:bold;">class</span> MyForm<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>,
                          <span style="color: #483d8b;">&quot;File and Folder Dialogs Tutorial&quot;</span><span style="color: black;">&#41;</span>
        panel = wx.<span style="color: black;">Panel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, wx.<span style="color: black;">ID_ANY</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">currentDirectory</span> = <span style="color: #dc143c;">os</span>.<span style="color: black;">getcwd</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># create the buttons and bindings</span>
        openFileDlgBtn = wx.<span style="color: black;">Button</span><span style="color: black;">&#40;</span>panel, label=<span style="color: #483d8b;">&quot;Show OPEN FileDialog&quot;</span><span style="color: black;">&#41;</span>
        openFileDlgBtn.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onOpenFile</span><span style="color: black;">&#41;</span>
&nbsp;
        saveFileDlgBtn = wx.<span style="color: black;">Button</span><span style="color: black;">&#40;</span>panel, label=<span style="color: #483d8b;">&quot;Show SAVE FileDialog&quot;</span><span style="color: black;">&#41;</span>
        saveFileDlgBtn.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onSaveFile</span><span style="color: black;">&#41;</span>
&nbsp;
        dirDlgBtn = wx.<span style="color: black;">Button</span><span style="color: black;">&#40;</span>panel, label=<span style="color: #483d8b;">&quot;Show DirDialog&quot;</span><span style="color: black;">&#41;</span>
        dirDlgBtn.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onDir</span><span style="color: black;">&#41;</span>
&nbsp;
        multiDirDlgBtn = wx.<span style="color: black;">Button</span><span style="color: black;">&#40;</span>panel, label=<span style="color: #483d8b;">&quot;Show MultiDirDialog&quot;</span><span style="color: black;">&#41;</span>
        multiDirDlgBtn.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onMultiDir</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># put the buttons in a sizer</span>
        sizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>openFileDlgBtn, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>saveFileDlgBtn, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>dirDlgBtn, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>multiDirDlgBtn, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        panel.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span>sizer<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onDir<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        Show the DirDialog and print the user's choice to stdout
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        dlg = wx.<span style="color: black;">DirDialog</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #483d8b;">&quot;Choose a directory:&quot;</span>,
                           style=wx.<span style="color: black;">DD_DEFAULT_STYLE</span>
                           <span style="color: #808080; font-style: italic;">#| wx.DD_DIR_MUST_EXIST</span>
                           <span style="color: #808080; font-style: italic;">#| wx.DD_CHANGE_DIR</span>
                           <span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> dlg.<span style="color: black;">ShowModal</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == wx.<span style="color: black;">ID_OK</span>:
            <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;You chose %s&quot;</span> <span style="color: #66cc66;">%</span> dlg.<span style="color: black;">GetPath</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        dlg.<span style="color: black;">Destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onMultiDir<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        Create and show the MultiDirDialog
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        dlg = MDD.<span style="color: black;">MultiDirDialog</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, title=<span style="color: #483d8b;">&quot;Choose a directory:&quot;</span>,
                                 defaultPath=<span style="color: #008000;">self</span>.<span style="color: black;">currentDirectory</span>,
                                 agwStyle=<span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> dlg.<span style="color: black;">ShowModal</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == wx.<span style="color: black;">ID_OK</span>:
            paths = dlg.<span style="color: black;">GetPaths</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;You chose the following file(s):&quot;</span>
            <span style="color: #ff7700;font-weight:bold;">for</span> path <span style="color: #ff7700;font-weight:bold;">in</span> paths:
                <span style="color: #ff7700;font-weight:bold;">print</span> path
        dlg.<span style="color: black;">Destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onOpenFile<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        Create and show the Open FileDialog
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        dlg = wx.<span style="color: black;">FileDialog</span><span style="color: black;">&#40;</span>
            <span style="color: #008000;">self</span>, message=<span style="color: #483d8b;">&quot;Choose a file&quot;</span>,
            defaultDir=<span style="color: #008000;">self</span>.<span style="color: black;">currentDirectory</span>,
            defaultFile=<span style="color: #483d8b;">&quot;&quot;</span>,
            wildcard=wildcard,
            style=wx.<span style="color: black;">OPEN</span> | wx.<span style="color: black;">MULTIPLE</span> | wx.<span style="color: black;">CHANGE_DIR</span>
            <span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> dlg.<span style="color: black;">ShowModal</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == wx.<span style="color: black;">ID_OK</span>:
            paths = dlg.<span style="color: black;">GetPaths</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;You chose the following file(s):&quot;</span>
            <span style="color: #ff7700;font-weight:bold;">for</span> path <span style="color: #ff7700;font-weight:bold;">in</span> paths:
                <span style="color: #ff7700;font-weight:bold;">print</span> path
        dlg.<span style="color: black;">Destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onSaveFile<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        Create and show the Save FileDialog
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        dlg = wx.<span style="color: black;">FileDialog</span><span style="color: black;">&#40;</span>
            <span style="color: #008000;">self</span>, message=<span style="color: #483d8b;">&quot;Save file as ...&quot;</span>,
            defaultDir=<span style="color: #008000;">self</span>.<span style="color: black;">currentDirectory</span>,
            defaultFile=<span style="color: #483d8b;">&quot;&quot;</span>, wildcard=wildcard, style=wx.<span style="color: black;">SAVE</span>
            <span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> dlg.<span style="color: black;">ShowModal</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == wx.<span style="color: black;">ID_OK</span>:
            path = dlg.<span style="color: black;">GetPath</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;You chose the following filename: %s&quot;</span> <span style="color: #66cc66;">%</span> path
        dlg.<span style="color: black;">Destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
<span style="color: #808080; font-style: italic;"># Run the program</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app = wx.<span style="color: black;">App</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
    frame = MyForm<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    frame.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<h3>Opening and Saving File Dialogs</h3>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/openFileDlg.png"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/openFileDlg.png" alt="" title="openFileDlg" width="451" height="314" class="aligncenter size-full wp-image-988" /></a></p>
<p>The <a href="http://www.wxpython.org/docs/api/wx.FileDialog-class.html">wx.FileDialog</a> has two versions: The open and the save file version. The open version is above and the save version is below:</p>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/saveFileDlg.png"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/saveFileDlg.png" alt="" title="saveFileDlg" width="451" height="314" class="aligncenter size-full wp-image-989" /></a></p>
<p>Let&#8217;s take a look at the code for each of these:</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">def</span> onOpenFile<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
    Create and show the Open FileDialog
    &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
    dlg = wx.<span style="color: black;">FileDialog</span><span style="color: black;">&#40;</span>
        <span style="color: #008000;">self</span>, message=<span style="color: #483d8b;">&quot;Choose a file&quot;</span>,
        defaultDir=<span style="color: #008000;">self</span>.<span style="color: black;">currentDirectory</span>,
        defaultFile=<span style="color: #483d8b;">&quot;&quot;</span>,
        wildcard=wildcard,
        style=wx.<span style="color: black;">OPEN</span> | wx.<span style="color: black;">MULTIPLE</span> | wx.<span style="color: black;">CHANGE_DIR</span>
        <span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> dlg.<span style="color: black;">ShowModal</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == wx.<span style="color: black;">ID_OK</span>:
        paths = dlg.<span style="color: black;">GetPaths</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;You chose the following file(s):&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> path <span style="color: #ff7700;font-weight:bold;">in</span> paths:
            <span style="color: #ff7700;font-weight:bold;">print</span> path
    dlg.<span style="color: black;">Destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
<span style="color: #ff7700;font-weight:bold;">def</span> onSaveFile<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
    Create and show the Save FileDialog
    &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
    dlg = wx.<span style="color: black;">FileDialog</span><span style="color: black;">&#40;</span>
        <span style="color: #008000;">self</span>, message=<span style="color: #483d8b;">&quot;Save file as ...&quot;</span>,
        defaultDir=<span style="color: #008000;">self</span>.<span style="color: black;">currentDirectory</span>,
        defaultFile=<span style="color: #483d8b;">&quot;&quot;</span>, wildcard=wildcard, style=wx.<span style="color: black;">SAVE</span>
        <span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> dlg.<span style="color: black;">ShowModal</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == wx.<span style="color: black;">ID_OK</span>:
        path = dlg.<span style="color: black;">GetPath</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;You chose the following filename: %s&quot;</span> <span style="color: #66cc66;">%</span> path
    dlg.<span style="color: black;">Destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>The <em>onOpenFile</em> method shows how to create the open version. You can set the dialog&#8217;s title, what directory the dialog will open in, what files it will show, the default file chosen, whether or not you can choose multiple files (the wx.MULTIPLE flag) and whether or not you can change directories (via the CHANGE_DIR flag). In this example, we use the dialog&#8217;s GetPaths method to grab the one or more paths chosen by our user and then we print those choices to stdout.</p>
<p>The save version of the dialog is almost the same. The only difference is that we have changed the style to wx.SAVE. </p>
<h3>wx.DirDialog</h3>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/dirDlg.png"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/dirDlg.png" alt="" title="dirDlg" width="389" height="531" class="aligncenter size-full wp-image-990" /></a></p>
<p>The <a href="http://www.wxpython.org/docs/api/wx.DirDialog-class.html">DirDialog </a>is even easier to instantiate than the file dialogs! Here&#8217;s the simple code:</p>
<pre class="python"><span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
<span style="color: #ff7700;font-weight:bold;">def</span> onDir<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
    Show the DirDialog and print the user's choice to stdout
    &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
    dlg = wx.<span style="color: black;">DirDialog</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #483d8b;">&quot;Choose a directory:&quot;</span>,
                       style=wx.<span style="color: black;">DD_DEFAULT_STYLE</span>
                       <span style="color: #808080; font-style: italic;">#| wx.DD_DIR_MUST_EXIST</span>
                       <span style="color: #808080; font-style: italic;">#| wx.DD_CHANGE_DIR</span>
                       <span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> dlg.<span style="color: black;">ShowModal</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == wx.<span style="color: black;">ID_OK</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;You chose %s&quot;</span> <span style="color: #66cc66;">%</span> dlg.<span style="color: black;">GetPath</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    dlg.<span style="color: black;">Destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>We can only change a few items with this dialog: the title, whether or not the directory must already exist and whether or not the user can change directories. You can also set the default directory that it starts in via the defaultPath parameter.</p>
<h3>The MultiDirDialog (AGW)</h3>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/multiDirDlg.png"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/multiDirDlg.png" alt="" title="multiDirDlg" width="354" height="483" class="aligncenter size-full wp-image-991" /></a></p>
<p>The <a href="http://www.wxpython.org/docs/api/wx.lib.agw.multidirdialog.MultiDirDialog-class.html">MultiDirDialog</a> from the <a href="http://xoomer.virgilio.it/infinity77/AGW_Docs/multidirdialog_module.html">AGW library</a> is a pure python implementation of the wx.DirDialog, but with more features. It allows the user to choose multiple directories at once, for example. Here&#8217;s a simple example of how to use it:</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">def</span> onMultiDir<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
    Create and show the MultiDirDialog
    &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
    dlg = MDD.<span style="color: black;">MultiDirDialog</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, title=<span style="color: #483d8b;">&quot;Choose a directory:&quot;</span>,
                             defaultPath=<span style="color: #008000;">self</span>.<span style="color: black;">currentDirectory</span>,
                             agwStyle=<span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> dlg.<span style="color: black;">ShowModal</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == wx.<span style="color: black;">ID_OK</span>:
        paths = dlg.<span style="color: black;">GetPaths</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;You chose the following file(s):&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> path <span style="color: #ff7700;font-weight:bold;">in</span> paths:
            <span style="color: #ff7700;font-weight:bold;">print</span> path
    dlg.<span style="color: black;">Destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>While this code doesn&#8217;t show it, you can also set whether or not you want to allow the user to create a new directory. Other than that and the special agwStyle flag, there&#8217;s not much different about this dialog. Still, it&#8217;s handy to have since it&#8217;s written in python and you can enhance it much easier than you could the wx.DirDialog version.</p>
<h2>wx.FontDialog</h2>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/fontDialog.png"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/fontDialog.png" alt="" title="fontDialog" width="504" height="630" class="aligncenter size-full wp-image-993" /></a></p>
<p>The <a href="http://www.wxpython.org/docs/api/wx.FontDialog-class.html">FontDialog </a>gives the user the ability to choose a font. For this example, we&#8217;ll use a slightly modified version of code from the wxPython demo itself:</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> wx
<span style="color: #ff7700;font-weight:bold;">from</span> wx.<span style="color: black;">lib</span> <span style="color: #ff7700;font-weight:bold;">import</span> stattext
&nbsp;
<span style="color: #808080; font-style: italic;">#---------------------------------------------------------------------------</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> TestPanel<span style="color: black;">&#40;</span>wx.<span style="color: black;">Panel</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, parent<span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Panel</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, parent, <span style="color: #ff4500;">-1</span><span style="color: black;">&#41;</span>
&nbsp;
        btn = wx.<span style="color: black;">Button</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #ff4500;">-1</span>, <span style="color: #483d8b;">&quot;Select Font&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">OnSelectFont</span>, btn<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">sampleText</span> = stattext.<span style="color: black;">GenStaticText</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #ff4500;">-1</span>, <span style="color: #483d8b;">&quot;Sample Text&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">sampleText</span>.<span style="color: black;">SetBackgroundColour</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">WHITE</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">curFont</span> = <span style="color: #008000;">self</span>.<span style="color: black;">sampleText</span>.<span style="color: black;">GetFont</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">curClr</span> = wx.<span style="color: black;">BLACK</span>
&nbsp;
        fgs = wx.<span style="color: black;">FlexGridSizer</span><span style="color: black;">&#40;</span>cols=<span style="color: #ff4500;">2</span>, vgap=<span style="color: #ff4500;">5</span>, hgap=<span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        fgs.<span style="color: black;">AddGrowableCol</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
        fgs.<span style="color: black;">AddGrowableRow</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
&nbsp;
        fgs.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>btn<span style="color: black;">&#41;</span>
        fgs.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">sampleText</span>, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ADJUST_MINSIZE</span>|wx.<span style="color: black;">GROW</span><span style="color: black;">&#41;</span>
&nbsp;
        fgs.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">15</span>,<span style="color: #ff4500;">15</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span> fgs.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">15</span>,<span style="color: #ff4500;">15</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>   <span style="color: #808080; font-style: italic;"># an empty row</span>
&nbsp;
        fgs.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">StaticText</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #ff4500;">-1</span>, <span style="color: #483d8b;">&quot;PointSize:&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">ps</span> = wx.<span style="color: black;">StaticText</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #ff4500;">-1</span>, <span style="color: #483d8b;">&quot;&quot;</span><span style="color: black;">&#41;</span>
        font = <span style="color: #008000;">self</span>.<span style="color: black;">ps</span>.<span style="color: black;">GetFont</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        font.<span style="color: black;">SetWeight</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">BOLD</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">ps</span>.<span style="color: black;">SetFont</span><span style="color: black;">&#40;</span>font<span style="color: black;">&#41;</span>
        fgs.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">ps</span>, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ADJUST_MINSIZE</span><span style="color: black;">&#41;</span>
&nbsp;
        fgs.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">StaticText</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #ff4500;">-1</span>, <span style="color: #483d8b;">&quot;Family:&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">family</span> = wx.<span style="color: black;">StaticText</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #ff4500;">-1</span>, <span style="color: #483d8b;">&quot;&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">family</span>.<span style="color: black;">SetFont</span><span style="color: black;">&#40;</span>font<span style="color: black;">&#41;</span>
        fgs.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">family</span>, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ADJUST_MINSIZE</span><span style="color: black;">&#41;</span>
&nbsp;
        fgs.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">StaticText</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #ff4500;">-1</span>, <span style="color: #483d8b;">&quot;Style:&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">style</span> = wx.<span style="color: black;">StaticText</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #ff4500;">-1</span>, <span style="color: #483d8b;">&quot;&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">style</span>.<span style="color: black;">SetFont</span><span style="color: black;">&#40;</span>font<span style="color: black;">&#41;</span>
        fgs.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">style</span>, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ADJUST_MINSIZE</span><span style="color: black;">&#41;</span>
&nbsp;
        fgs.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">StaticText</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #ff4500;">-1</span>, <span style="color: #483d8b;">&quot;Weight:&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">weight</span> = wx.<span style="color: black;">StaticText</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #ff4500;">-1</span>, <span style="color: #483d8b;">&quot;&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">weight</span>.<span style="color: black;">SetFont</span><span style="color: black;">&#40;</span>font<span style="color: black;">&#41;</span>
        fgs.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">weight</span>, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ADJUST_MINSIZE</span><span style="color: black;">&#41;</span>
&nbsp;
        fgs.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">StaticText</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #ff4500;">-1</span>, <span style="color: #483d8b;">&quot;Face:&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">face</span> = wx.<span style="color: black;">StaticText</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #ff4500;">-1</span>, <span style="color: #483d8b;">&quot;&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">face</span>.<span style="color: black;">SetFont</span><span style="color: black;">&#40;</span>font<span style="color: black;">&#41;</span>
        fgs.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">face</span>, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ADJUST_MINSIZE</span><span style="color: black;">&#41;</span>
&nbsp;
        fgs.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">15</span>,<span style="color: #ff4500;">15</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span> fgs.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">15</span>,<span style="color: #ff4500;">15</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>   <span style="color: #808080; font-style: italic;"># an empty row</span>
&nbsp;
        fgs.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">StaticText</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #ff4500;">-1</span>, <span style="color: #483d8b;">&quot;wx.NativeFontInfo:&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">nfi</span> = wx.<span style="color: black;">StaticText</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #ff4500;">-1</span>, <span style="color: #483d8b;">&quot;&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">nfi</span>.<span style="color: black;">SetFont</span><span style="color: black;">&#40;</span>font<span style="color: black;">&#41;</span>
        fgs.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">nfi</span>, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ADJUST_MINSIZE</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># give it some border space</span>
        sizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>fgs, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">GROW</span>|wx.<span style="color: black;">ADJUST_MINSIZE</span>|wx.<span style="color: black;">ALL</span>, <span style="color: #ff4500;">25</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span>sizer<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">UpdateUI</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> UpdateUI<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">sampleText</span>.<span style="color: black;">SetFont</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">curFont</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">sampleText</span>.<span style="color: black;">SetForegroundColour</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">curClr</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">ps</span>.<span style="color: black;">SetLabel</span><span style="color: black;">&#40;</span><span style="color: #008000;">str</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">curFont</span>.<span style="color: black;">GetPointSize</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">family</span>.<span style="color: black;">SetLabel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">curFont</span>.<span style="color: black;">GetFamilyString</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">style</span>.<span style="color: black;">SetLabel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">curFont</span>.<span style="color: black;">GetStyleString</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">weight</span>.<span style="color: black;">SetLabel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">curFont</span>.<span style="color: black;">GetWeightString</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">face</span>.<span style="color: black;">SetLabel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">curFont</span>.<span style="color: black;">GetFaceName</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">nfi</span>.<span style="color: black;">SetLabel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">curFont</span>.<span style="color: black;">GetNativeFontInfo</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">ToString</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">Layout</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> OnSelectFont<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, evt<span style="color: black;">&#41;</span>:
        data = wx.<span style="color: black;">FontData</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        data.<span style="color: black;">EnableEffects</span><span style="color: black;">&#40;</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
        data.<span style="color: black;">SetColour</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">curClr</span><span style="color: black;">&#41;</span>         <span style="color: #808080; font-style: italic;"># set colour</span>
        data.<span style="color: black;">SetInitialFont</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">curFont</span><span style="color: black;">&#41;</span>
&nbsp;
        dlg = wx.<span style="color: black;">FontDialog</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, data<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> dlg.<span style="color: black;">ShowModal</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == wx.<span style="color: black;">ID_OK</span>:
            data = dlg.<span style="color: black;">GetFontData</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            font = data.<span style="color: black;">GetChosenFont</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            colour = data.<span style="color: black;">GetColour</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
            <span style="color: #008000;">self</span>.<span style="color: black;">curFont</span> = font
            <span style="color: #008000;">self</span>.<span style="color: black;">curClr</span> = colour
            <span style="color: #008000;">self</span>.<span style="color: black;">UpdateUI</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># Don't destroy the dialog until you get everything you need from the</span>
        <span style="color: #808080; font-style: italic;"># dialog!</span>
        dlg.<span style="color: black;">Destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;">########################################################################</span>
<span style="color: #ff7700;font-weight:bold;">class</span> MyForm<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>,
                          <span style="color: #483d8b;">&quot;wx.FontDialog Tutorial&quot;</span><span style="color: black;">&#41;</span>
        panel = TestPanel<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
<span style="color: #808080; font-style: italic;"># Run the program</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app = wx.<span style="color: black;">App</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
    frame = MyForm<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    frame.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>In this example, we create and show the dialog in the <em>OnSelectFont</em> method. For reasons I don&#8217;t fully understand, we create a font data object right off the bat and set various attributes for it. Then if the user chooses a font and hits the OK button, we dump those settings and create new ones based on the user&#8217;s choice. We extract the font and color data from the user chosen font and set some class attributes. Next we call the <em>UpdateUI</em> method. This will update our GenStaticText to show the chosen font. Feel free to look at how that&#8217;s accomplished in the <em>UpdateUI</em> method.</p>
<h2>wx.MessageDialog</h2>
<p>The <a href="http://www.wxpython.org/docs/api/wx.MessageDialog-class.html">wx.MessageDialog</a> is used to give the user some sort of message or to ask a simple question. Here are a few example screenshots:</p>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/errorMsgDialog.png"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/errorMsgDialog.png" alt="" title="errorMsgDialog" width="452" height="180" class="aligncenter size-full wp-image-994" /></a></p>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/infoMsgDlg.png"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/infoMsgDlg.png" alt="" title="infoMsgDlg" width="396" height="220" class="aligncenter size-full wp-image-995" /></a></p>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/questionMsgDlg.png"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/questionMsgDlg.png" alt="" title="questionMsgDlg" width="288" height="220" class="aligncenter size-full wp-image-996" /></a></p>
<p>Now let&#8217;s take a quick look at how we can create these dialogs!</p>
<pre class="python"><span style="color: #808080; font-style: italic;"># http://www.wxpython.org/docs/api/wx.MessageDialog-class.html</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> wx
&nbsp;
<span style="color: #808080; font-style: italic;">########################################################################</span>
<span style="color: #ff7700;font-weight:bold;">class</span> MyForm<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>,
                          <span style="color: #483d8b;">&quot;MessageDialog Tutorial&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">panel</span> = wx.<span style="color: black;">Panel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, wx.<span style="color: black;">ID_ANY</span><span style="color: black;">&#41;</span>
&nbsp;
        sizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        buttons = <span style="color: black;">&#91;</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Exclamation&quot;</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onExclamation</span><span style="color: black;">&#41;</span>,
                   <span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Information&quot;</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onInfo</span><span style="color: black;">&#41;</span>,
                   <span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Question&quot;</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onQuestion</span><span style="color: black;">&#41;</span>
                   <span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> label, handler <span style="color: #ff7700;font-weight:bold;">in</span> buttons:
            <span style="color: #008000;">self</span>.<span style="color: black;">createAndLayoutButtons</span><span style="color: black;">&#40;</span>label, handler, sizer<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">panel</span>.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span>sizer<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> createAndLayoutButtons<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, label, handler, sizer<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        button = wx.<span style="color: black;">Button</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">panel</span>, label=label<span style="color: black;">&#41;</span>
        button.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, handler<span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>button, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onExclamation<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        msg = <span style="color: #483d8b;">&quot;You have an encountered an unknown error. Would you like to continue?&quot;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">showMessageDlg</span><span style="color: black;">&#40;</span>msg, <span style="color: #483d8b;">&quot;ERROR&quot;</span>,
                            wx.<span style="color: black;">YES_NO</span>|wx.<span style="color: black;">YES_DEFAULT</span>|wx.<span style="color: black;">ICON_EXCLAMATION</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onInfo<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        This method is fired when its corresponding button is pressed
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">showMessageDlg</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;This is for informational purposes only!&quot;</span>,
                            <span style="color: #483d8b;">&quot;Information&quot;</span>, wx.<span style="color: black;">OK</span>|wx.<span style="color: black;">ICON_INFORMATION</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onQuestion<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">showMessageDlg</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Why did you push me?&quot;</span>, <span style="color: #483d8b;">&quot;Question&quot;</span>,
                            wx.<span style="color: black;">OK</span>|wx.<span style="color: black;">CANCEL</span>|wx.<span style="color: black;">ICON_QUESTION</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> showMessageDlg<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, msg, title, style<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        dlg = wx.<span style="color: black;">MessageDialog</span><span style="color: black;">&#40;</span>parent=<span style="color: #008000;">None</span>, message=msg,
                               caption=title, style=style<span style="color: black;">&#41;</span>
        dlg.<span style="color: black;">ShowModal</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        dlg.<span style="color: black;">Destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Run the program</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app = wx.<span style="color: black;">App</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
    frame = MyForm<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    frame.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>If you look at the example above you&#8217;ll quickly notice that we can change the appearance of the MessageDialog using only style flags:</p>
<ul>
<li>wx.YES_NO gives the dialog a Yes and a No button</li>
<li>wx.OK gives us just an OK button</li>
<li>wx.OK|wx.CANCEL creates both an OK and a Cancel button</li>
<li>wx.ICON_EXCLAMATION puts a yellow triangle icon in our dialog</li>
<li>wx.ICON_INFORMATION creates a round blue icon</li>
<li>wx.ICON_QUESTION gives us a question mark icon</li>
</ul>
<p>There are several more flags we could use listed in the <a href="http://www.wxpython.org/docs/api/wx.MessageDialog-class.html">documentation</a>, but they&#8217;re mostly redundant. Feel free to read up on them though.</p>
<h2>Wrapping Up</h2>
<p>We&#8217;ve covered a lot of ground in this article. You now know how to create about half the provided standard dialogs that are included with wxPython. We&#8217;ll look at the other half in the second part of this article. In the meantime, I hope you have found this enlightening. Feel free to ask questions in the comments!</p>
<p><strong>Note: This code was tested on the following:</strong></p>
<ul>
<li>Windows XP Professional, wxPython 2.8.10.1 / 2.8.11.0, Python 2.5</li>
<li>Windows 7 Home Edition, wxPython 2.8.10.1, Python 2.6</li>
</ul>
<h2>Additional Reading</h2>
<ul>
<li>wx.BusyInfo <a href="http://www.wxpython.org/docs/api/wx.BusyInfo-class.html">documentation </a>or see the <a href="http://wiki.wxpython.org/BusyInfo">wiki page</a></li>
<li>wx.ColourDialog <a href="http://www.wxpython.org/docs/api/wx.ColourDialog-class.html">documentation</a></li>
<li>CubeColourDialog (AGW) <a href="http://www.wxpython.org/docs/api/wx.lib.agw.cubecolourdialog.CubeColourDialog-class.html">documentation </a>(also see <a href="http://xoomer.virgilio.it/infinity77/AGW_Docs/cubecolourdialog.CubeColourDialog.html">Gavana&#8217;s docs</a>)</li>
<li><a href="http://www.wxpython.org/docs/api/wx.lib.colourchooser.pycolourchooser.PyColourChooser-class.html">PyColourChooser documentation</a></li>
<li><a href="http://www.wxpython.org/docs/api/wx.DirDialog-class.html">wx.DirDialog</a> and <a href="http://www.wxpython.org/docs/api/wx.lib.agw.multidirdialog.MultiDirDialog-class.html">MultiDirDialog </a>(<a href="http://xoomer.virgilio.it/infinity77/AGW_Docs/multidirdialog_module.html">AGW</a>)</li>
<li>wx.FileDialog <a href="http://www.wxpython.org/docs/api/wx.FontDialog-class.html">documentation</a></li>
<li>wx.FontDialog <a href="http://www.wxpython.org/docs/api/wx.FontDialog-class.html">documentation</a></li>
<li>wx.MessageDialog <a href="http://www.wxpython.org/docs/api/wx.MessageDialog-class.html">documentation</a></li>
</ul>
<h2>Downloads</h2>
<ul>
<li><a href='http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/dialogs_part_one.zip'>dialogs_part_one.zip</a></li>
<li><a href='http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/dialogs_part_one.tar'>dialogs_part_one.tar</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.blog.pythonlibrary.org/2010/06/26/the-dialogs-of-wxpython-part-1-of-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>wxPython: How to Switch Between Panels</title>
		<link>http://www.blog.pythonlibrary.org/2010/06/16/wxpython-how-to-switch-between-panels/</link>
		<comments>http://www.blog.pythonlibrary.org/2010/06/16/wxpython-how-to-switch-between-panels/#comments</comments>
		<pubDate>Thu, 17 Jun 2010 01:43:16 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[wxPython]]></category>
		<category><![CDATA[panels]]></category>

		<guid isPermaLink="false">http://www.blog.pythonlibrary.org/?p=962</guid>
		<description><![CDATA[Every couple of months, I&#8217;ll see someone asking how to switch between two views or panels in a wxPython application that they&#8217;re working on. Since this is such a common question and because I had it asked last week on the wxPython channel on IRC, I wrote up a quick script that shows how it&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>Every couple of months, I&#8217;ll see someone asking how to switch between two views or panels in a wxPython application that they&#8217;re working on. Since this is such a common question and because I had it asked last week on the wxPython channel on IRC, I wrote up a quick script that shows how it&#8217;s done. Note that in most cases, the user will probably find one of the many notebook widgets to be more than sufficient for their needs. Anyway, let&#8217;s take a look at how to do this thing!<span id="more-962"></span></p>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/panelswitcherOne.png"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/panelswitcherOne.png" alt="" title="panelswitcherOne" width="400" height="250" class="aligncenter size-full wp-image-963" /></a></p>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/panelswitcherTwo.png"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/panelswitcherTwo.png" alt="" title="panelswitcherTwo" width="430" height="256" class="aligncenter size-full wp-image-964" /></a></p>
<p>In this example, we&#8217;ll use a menu to toggle between two panels. The first panel will have just a text control on it and the second panel will just have a grid widget.</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> wx
<span style="color: #ff7700;font-weight:bold;">import</span> wx.<span style="color: black;">grid</span> as gridlib
&nbsp;
<span style="color: #808080; font-style: italic;">########################################################################</span>
<span style="color: #ff7700;font-weight:bold;">class</span> PanelOne<span style="color: black;">&#40;</span>wx.<span style="color: black;">Panel</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, parent<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;Constructor&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        wx.<span style="color: black;">Panel</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, parent=parent<span style="color: black;">&#41;</span>
        txt = wx.<span style="color: black;">TextCtrl</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">########################################################################</span>
<span style="color: #ff7700;font-weight:bold;">class</span> PanelTwo<span style="color: black;">&#40;</span>wx.<span style="color: black;">Panel</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, parent<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;Constructor&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        wx.<span style="color: black;">Panel</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, parent=parent<span style="color: black;">&#41;</span>
&nbsp;
        grid = gridlib.<span style="color: black;">Grid</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
        grid.<span style="color: black;">CreateGrid</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">25</span>,<span style="color: #ff4500;">12</span><span style="color: black;">&#41;</span>
&nbsp;
        sizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>grid, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">EXPAND</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span>sizer<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">########################################################################</span>
<span style="color: #ff7700;font-weight:bold;">class</span> MyForm<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>,
                          <span style="color: #483d8b;">&quot;Panel Switcher Tutorial&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">panel_one</span> = PanelOne<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">panel_two</span> = PanelTwo<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">panel_two</span>.<span style="color: black;">Hide</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">sizer</span> = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">sizer</span>.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">panel_one</span>, <span style="color: #ff4500;">1</span>, wx.<span style="color: black;">EXPAND</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">sizer</span>.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">panel_two</span>, <span style="color: #ff4500;">1</span>, wx.<span style="color: black;">EXPAND</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">sizer</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
        menubar = wx.<span style="color: black;">MenuBar</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        fileMenu = wx.<span style="color: black;">Menu</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        switch_panels_menu_item = fileMenu.<span style="color: black;">Append</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">ID_ANY</span>,
                                                  <span style="color: #483d8b;">&quot;Switch Panels&quot;</span>,
                                                  <span style="color: #483d8b;">&quot;Some text&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_MENU</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onSwitchPanels</span>,
                  switch_panels_menu_item<span style="color: black;">&#41;</span>
        menubar.<span style="color: black;">Append</span><span style="color: black;">&#40;</span>fileMenu, <span style="color: #483d8b;">'&amp;File'</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">SetMenuBar</span><span style="color: black;">&#40;</span>menubar<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onSwitchPanels<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">panel_one</span>.<span style="color: black;">IsShown</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">SetTitle</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Panel Two Showing&quot;</span><span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">panel_one</span>.<span style="color: black;">Hide</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">panel_two</span>.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">SetTitle</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Panel One Showing&quot;</span><span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">panel_one</span>.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">panel_two</span>.<span style="color: black;">Hide</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">Layout</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;"># Run the program</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app = wx.<span style="color: black;">App</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
    frame = MyForm<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    frame.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>The only code that we care about is located in the <em>onSwitchPanels</em> event handler. Here we use a conditional to check which panel is showing and then Hide the current one and Show the other. We also set the frame&#8217;s title to make it obvious which panel is which. We also need to call the frame&#8217;s Layout() method to make the panels visible. Otherwise you might see some weird visual anomalies like nothing really showing in the frame unless you resize it slightly. </p>
<p>Now you know how to switch panels too. If you plan to do a lot of visual work, like adding or deleting widgets, then you might want to look into the Freeze and Thaw methods and then use Layout. They help hide the flickering that can be seen when you modify a panel&#8217;s children.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.blog.pythonlibrary.org/2010/06/16/wxpython-how-to-switch-between-panels/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>wxPython: A Tour of Buttons (Part 2 of 2)</title>
		<link>http://www.blog.pythonlibrary.org/2010/06/10/wxpython-a-tour-of-buttons-part-2-of-2/</link>
		<comments>http://www.blog.pythonlibrary.org/2010/06/10/wxpython-a-tour-of-buttons-part-2-of-2/#comments</comments>
		<pubDate>Thu, 10 Jun 2010 12:56:53 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[wxPython]]></category>

		<guid isPermaLink="false">http://www.blog.pythonlibrary.org/?p=936</guid>
		<description><![CDATA[In the last article, we covered a wide variety of buttons that come with the standard wxPython package. Now we&#8217;re going to look at a whole bunch more! In case you haven&#8217;t figured it out yet, wxPython takes Python&#8217;s &#8220;batteries included&#8221; philosophy very seriously! In this post we&#8217;ll look at the following buttons: wx.RadioButton wx.SpinButton [...]]]></description>
			<content:encoded><![CDATA[<p>In the last article, we covered a wide variety of buttons that come with the standard wxPython package. Now we&#8217;re going to look at a whole bunch more! In case you haven&#8217;t figured it out yet, wxPython takes Python&#8217;s &#8220;batteries included&#8221; philosophy  very seriously! In this post we&#8217;ll look at the following buttons:</p>
<ul>
<li>wx.RadioButton</li>
<li>wx.SpinButton</li>
<li>AquaButton (AGW)</li>
<li>GradientButton (AGW)</li>
<li>ShapedButton (AGW)</li>
</ul>
<p>Let&#8217;s get cracking!<span id="more-936"></span></p>
<h2>wx.RadioButton &#8211; Don&#8217;t Change That Channel!</h2>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/radioBtnTut.png"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/radioBtnTut.png" alt="" title="radioBtnTut" width="339" height="199" class="aligncenter size-full wp-image-938" /></a></p>
<p>The radio button is a well known widget even to grade schoolers as it is used in many standardized tests. Radio buttons serve to allow the developer to force the user to only select one option from a list of options. They are more visual than a ComboBox, although they basically serve the same purpose. Here&#8217;s a simple example:</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> wx
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> MyForm<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>, <span style="color: #483d8b;">&quot;Radio Button Tutorial&quot;</span><span style="color: black;">&#41;</span>
        panel = wx.<span style="color: black;">Panel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, wx.<span style="color: black;">ID_ANY</span><span style="color: black;">&#41;</span>
&nbsp;
        radio1 = wx.<span style="color: black;">RadioButton</span><span style="color: black;">&#40;</span> panel, <span style="color: #ff4500;">-1</span>, <span style="color: #483d8b;">&quot; Radio1 &quot;</span>, style = wx.<span style="color: black;">RB_GROUP</span> <span style="color: black;">&#41;</span>
        radio2 = wx.<span style="color: black;">RadioButton</span><span style="color: black;">&#40;</span> panel, <span style="color: #ff4500;">-1</span>, <span style="color: #483d8b;">&quot; Radio2 &quot;</span> <span style="color: black;">&#41;</span>
        radio3 = wx.<span style="color: black;">RadioButton</span><span style="color: black;">&#40;</span> panel, <span style="color: #ff4500;">-1</span>, <span style="color: #483d8b;">&quot; Radio3 &quot;</span> <span style="color: black;">&#41;</span>
&nbsp;
        radio1.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_RADIOBUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onButton</span><span style="color: black;">&#41;</span>
        radio2.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_RADIOBUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onButton</span><span style="color: black;">&#41;</span>
        radio3.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_RADIOBUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onButton</span><span style="color: black;">&#41;</span>
&nbsp;
        sizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>radio1, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>radio2, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>radio3, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        panel.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span>sizer<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onButton<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        This method is fired when its corresponding button is pressed
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        btn = event.<span style="color: black;">GetEventObject</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        label = btn.<span style="color: black;">GetLabel</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        message = <span style="color: #483d8b;">&quot;You just selected %s&quot;</span> <span style="color: #66cc66;">%</span> label
        dlg = wx.<span style="color: black;">MessageDialog</span><span style="color: black;">&#40;</span><span style="color: #008000;">None</span>, message, <span style="color: #483d8b;">'Message'</span>,
                               wx.<span style="color: black;">OK</span>|wx.<span style="color: black;">ICON_EXCLAMATION</span><span style="color: black;">&#41;</span>
        dlg.<span style="color: black;">ShowModal</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        dlg.<span style="color: black;">Destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Run the program</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app = wx.<span style="color: black;">App</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
    frame = MyForm<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    frame.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>Note that the main difference between this button and the ones that we saw in the <a href="http://www.blog.pythonlibrary.org/2010/06/09/wxpython-a-tour-of-buttons-part-1-of-2/">previous article</a> is the style flag: RB_GROUP. This causes all the following radio buttons to be a part of one group. If you set that flag again, then you&#8217;ll start a new group from that point on (see also the <a href="http://zetcode.com/wxpython/widgets/">Zetcode tutorial</a>). We have also bound each of the buttons to one event handler that will display a MessageDialog to the user that tells them which button they chose. Contrived? You bet! But it&#8217;s good for illustrative purposes.</p>
<h2>Let&#8217;s Take a Spin with wx.SpinButton</h2>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/spinButtonTut.png"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/spinButtonTut.png" alt="" title="spinButtonTut" width="317" height="180" class="aligncenter size-full wp-image-940" /></a></p>
<p>The SpinButton is actually just the up-down arrows to the right of the text control that you see in the screenshot above. Most of the time, the SpinCtrl or the FloatSpin widget would probably be better. But here&#8217;s an example anyway:</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> wx
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> MyForm<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>, <span style="color: #483d8b;">&quot;Spin Button Tutorial&quot;</span><span style="color: black;">&#41;</span>
        panel = wx.<span style="color: black;">Panel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, wx.<span style="color: black;">ID_ANY</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">text</span> = wx.<span style="color: black;">TextCtrl</span><span style="color: black;">&#40;</span>panel, value=<span style="color: #483d8b;">&quot;1&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">spin</span> = wx.<span style="color: black;">SpinButton</span><span style="color: black;">&#40;</span>panel, style=wx.<span style="color: black;">SP_VERTICAL</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">spin</span>.<span style="color: black;">SetRange</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">100</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">spin</span>.<span style="color: black;">SetValue</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_SPIN</span>, <span style="color: #008000;">self</span>.<span style="color: black;">OnSpin</span>, <span style="color: #008000;">self</span>.<span style="color: black;">spin</span><span style="color: black;">&#41;</span>
&nbsp;
        vSizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        sizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">HORIZONTAL</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">text</span>, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">CENTER</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">spin</span>, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">CENTER</span><span style="color: black;">&#41;</span>
        vSizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>sizer, <span style="color: #ff4500;">1</span>, wx.<span style="color: black;">CENTER</span><span style="color: black;">&#41;</span>
        panel.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span>vSizer<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> OnSpin<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">text</span>.<span style="color: black;">SetValue</span><span style="color: black;">&#40;</span><span style="color: #008000;">str</span><span style="color: black;">&#40;</span>event.<span style="color: black;">GetPosition</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Run the program</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app = wx.<span style="color: black;">App</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
    frame = MyForm<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    frame.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>The code above is taken almost verbatim from the wxPython Demo. Note that you can set the orientation of the buttons. In this case, we set it to be vertically oriented. You can also set it to be horizontal. There are other styles too, but there doesn&#8217;t appear to be much documentation so I was unable to find out which were for the SpinButton and which were for the SplitterWindow. Oh well. Back to the code above. As you can see, rather than binding to EVT_BUTTON as we have in the past, we instead bind to EVT_SPIN. For some reason the wxPython demo uses event.GetPosition to get the spinner&#8217;s position. You could just call &#8220;self.spin.GetValue&#8221; and get the same thing.</p>
<h2>Get Refreshed with AquaButton</h2>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/aquaButtonTut.png"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/aquaButtonTut.png" alt="" title="aquaButtonTut" width="313" height="188" class="aligncenter size-full wp-image-944" /></a></p>
<p>The next three buttons all come from the Advanced Generic Widgets (AGW) library that is included with wxPython and was created by Andrea Gavana. We will start off by looking at his AquaButton. The AquaButton is one of the simplest widgets in the AGW library. Let&#8217;s take a look at how we create a couple of them:</p>
<pre class="python"><span style="color: #808080; font-style: italic;"># aquaBtnDemo.py</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> wx
<span style="color: #ff7700;font-weight:bold;">import</span> wx.<span style="color: black;">lib</span>.<span style="color: black;">agw</span>.<span style="color: black;">aquabutton</span> as AB
&nbsp;
<span style="color: #808080; font-style: italic;">########################################################################</span>
<span style="color: #ff7700;font-weight:bold;">class</span> MyForm<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>, <span style="color: #483d8b;">&quot;AquaButton Tutorial&quot;</span><span style="color: black;">&#41;</span>
        panel = wx.<span style="color: black;">Panel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, wx.<span style="color: black;">ID_ANY</span><span style="color: black;">&#41;</span>
&nbsp;
        bmp = wx.<span style="color: black;">Bitmap</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;agt_mp3.png&quot;</span>, wx.<span style="color: black;">BITMAP_TYPE_ANY</span><span style="color: black;">&#41;</span>
        button = AB.<span style="color: black;">AquaButton</span><span style="color: black;">&#40;</span>panel, bitmap=bmp, label=<span style="color: #483d8b;">&quot;Press Me&quot;</span><span style="color: black;">&#41;</span>
        button.<span style="color: black;">SetForegroundColour</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;black&quot;</span><span style="color: black;">&#41;</span>
        button.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onButton</span><span style="color: black;">&#41;</span>
&nbsp;
        buttonTwo = AB.<span style="color: black;">AquaButton</span><span style="color: black;">&#40;</span>panel, label=<span style="color: #483d8b;">&quot;PulseOnFocus&quot;</span><span style="color: black;">&#41;</span>
        buttonTwo.<span style="color: black;">SetForegroundColour</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;black&quot;</span><span style="color: black;">&#41;</span>
        buttonTwo.<span style="color: black;">SetPulseOnFocus</span><span style="color: black;">&#40;</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
&nbsp;
        sizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>button, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">CENTER</span>|wx.<span style="color: black;">ALL</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>buttonTwo, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">CENTER</span>|wx.<span style="color: black;">ALL</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        panel.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span>sizer<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onButton<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        This method is fired when its corresponding button is pressed
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        message = <span style="color: #483d8b;">&quot;You pressed the button!&quot;</span>
        dlg = wx.<span style="color: black;">MessageDialog</span><span style="color: black;">&#40;</span><span style="color: #008000;">None</span>, message, <span style="color: #483d8b;">'Message'</span>,
                               wx.<span style="color: black;">OK</span>|wx.<span style="color: black;">ICON_EXCLAMATION</span><span style="color: black;">&#41;</span>
        dlg.<span style="color: black;">ShowModal</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        dlg.<span style="color: black;">Destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Run the program</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app = wx.<span style="color: black;">App</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
    frame = MyForm<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    frame.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>The AquaButton supports bitmaps, so in this example we show two buttons: one with a bitmap and one without. Another neat feature of the AquaButton is its ability to pulse when it has the focus. You can turn this feature on or off. The second button has this feature turned on. The reason that the ForegroundColour is set is because on Windows 7, the panel is a bright white in color and that makes it difficult to read the text on the button if you use the default font color. You can also set the AquaButton&#8217;s background color and its hover color.</p>
<h2>The GradientButton</h2>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/gradientBtnTut.png"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/gradientBtnTut.png" alt="" title="gradientBtnTut" width="341" height="161" class="aligncenter size-full wp-image-946" /></a></p>
<p>The GradientButton is similar to the AquaButton in that they both have rounded corners and can have an optional bitmap on them. The GradientButton does not support pulsing though. However, as its name implies, the GradientButton allows you to set its gradient from the top to the bottom as well as its top/bottom colors when pressed. We&#8217;ll just take a quick look at how to instantiate one since all the color setting is pretty self-explanatory and there are good examples of that in the wxPython demo:</p>
<pre class="python"><span style="color: #808080; font-style: italic;"># gradientBtnDemo.py</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> wx
<span style="color: #ff7700;font-weight:bold;">import</span> wx.<span style="color: black;">lib</span>.<span style="color: black;">agw</span>.<span style="color: black;">gradientbutton</span> as GB
&nbsp;
<span style="color: #808080; font-style: italic;">########################################################################</span>
<span style="color: #ff7700;font-weight:bold;">class</span> MyForm<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>, <span style="color: #483d8b;">&quot;GradientButton Tutorial&quot;</span><span style="color: black;">&#41;</span>
        panel = wx.<span style="color: black;">Panel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, wx.<span style="color: black;">ID_ANY</span><span style="color: black;">&#41;</span>
&nbsp;
        bmp = wx.<span style="color: black;">Bitmap</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;agt_mp3.png&quot;</span>, wx.<span style="color: black;">BITMAP_TYPE_ANY</span><span style="color: black;">&#41;</span>
        gbBtn = GB.<span style="color: black;">GradientButton</span><span style="color: black;">&#40;</span>panel, bitmap=bmp,
                                  label=<span style="color: #483d8b;">&quot;Gradient with bitmap&quot;</span><span style="color: black;">&#41;</span>
        gbBtnNoBmp = GB.<span style="color: black;">GradientButton</span><span style="color: black;">&#40;</span>panel, label=<span style="color: #483d8b;">&quot;Press Me&quot;</span><span style="color: black;">&#41;</span>
        gbBtnNoBmp.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onPressMe</span><span style="color: black;">&#41;</span>
&nbsp;
        sizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>gbBtn, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">CENTER</span>|wx.<span style="color: black;">ALL</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>gbBtnNoBmp, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">CENTER</span>|wx.<span style="color: black;">ALL</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        panel.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span>sizer<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onPressMe<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        message = <span style="color: #483d8b;">&quot;Thank You!&quot;</span>
        dlg = wx.<span style="color: black;">MessageDialog</span><span style="color: black;">&#40;</span><span style="color: #008000;">None</span>, message, <span style="color: #483d8b;">'Message'</span>,
                               wx.<span style="color: black;">OK</span>|wx.<span style="color: black;">ICON_EXCLAMATION</span><span style="color: black;">&#41;</span>
        dlg.<span style="color: black;">ShowModal</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        dlg.<span style="color: black;">Destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Run the program</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app = wx.<span style="color: black;">App</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
    frame = MyForm<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    frame.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>As you can see, creating a GradientButton is quite simple and straightforward. Feel free to give it a try! I&#8217;ll wait&#8230;done already? Then let&#8217;s finish up with the ShapedButton!</p>
<h2>Get Into Shape with the ShapedButton</h2>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/shapedBtnTut.png"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/shapedBtnTut.png" alt="" title="shapedBtnTut" width="400" height="160" class="aligncenter size-full wp-image-947" /></a></p>
<p>The ShapedButton is probably the most complex button that we&#8217;ll look at in this article. By complex, I mean, full-featured. You can create a normal button, a bitmap button, a weird offset bitmap+text button, toggle buttons and you can rotate the text at any angle. If you look at the wxPython demo, you&#8217;ll also see how to make the button into an elliptical shape. The ShapedButton requires the <a href="http://www.pythonware.com/products/pil/">Python Imaging Library</a> to be installed, so if you don&#8217;t have it, get it now! When you&#8217;re ready, we&#8217;ll look at the code used to create the screenshot above:</p>
<pre class="python"><span style="color: #808080; font-style: italic;"># shapedBtnDemo.py</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> wx
<span style="color: #ff7700;font-weight:bold;">from</span> wx.<span style="color: black;">lib</span>.<span style="color: black;">agw</span>.<span style="color: black;">shapedbutton</span> <span style="color: #ff7700;font-weight:bold;">import</span> SButton, SBitmapButton
<span style="color: #ff7700;font-weight:bold;">from</span> wx.<span style="color: black;">lib</span>.<span style="color: black;">agw</span>.<span style="color: black;">shapedbutton</span> <span style="color: #ff7700;font-weight:bold;">import</span> SBitmapToggleButton, SBitmapTextToggleButton
&nbsp;
<span style="color: #808080; font-style: italic;">########################################################################</span>
<span style="color: #ff7700;font-weight:bold;">class</span> MyForm<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>, <span style="color: #483d8b;">&quot;ShapedButton Tutorial&quot;</span><span style="color: black;">&#41;</span>
        panel = wx.<span style="color: black;">Panel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, wx.<span style="color: black;">ID_ANY</span><span style="color: black;">&#41;</span>
&nbsp;
        bmp = wx.<span style="color: black;">Bitmap</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;agt_mp3.png&quot;</span>, wx.<span style="color: black;">BITMAP_TYPE_ANY</span><span style="color: black;">&#41;</span>
        size = <span style="color: black;">&#40;</span><span style="color: #ff4500;">75</span>,<span style="color: #ff4500;">75</span><span style="color: black;">&#41;</span>
&nbsp;
        sBtn = SButton<span style="color: black;">&#40;</span>panel, label=<span style="color: #483d8b;">&quot;Press Me&quot;</span>, size=size<span style="color: black;">&#41;</span>
        sBtn.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onShapedBtn</span><span style="color: black;">&#41;</span>
&nbsp;
        bmpBtn = SBitmapButton<span style="color: black;">&#40;</span>panel, wx.<span style="color: black;">ID_ANY</span>, bitmap=bmp<span style="color: black;">&#41;</span>
        bmpBtn.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onBmpShapedBtn</span><span style="color: black;">&#41;</span>
&nbsp;
        bmpToggleBtn = SBitmapToggleButton<span style="color: black;">&#40;</span>panel, wx.<span style="color: black;">ID_ANY</span>, bitmap=bmp<span style="color: black;">&#41;</span>
        bmpToggleBtn.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onToggle</span><span style="color: black;">&#41;</span>
&nbsp;
        bmpToggleTxtBtn = SBitmapTextToggleButton<span style="color: black;">&#40;</span>panel, wx.<span style="color: black;">ID_ANY</span>,
                                                  bitmap=bmp,
                                                  label=<span style="color: #483d8b;">&quot;Toggle!&quot;</span>,
                                                  size=<span style="color: black;">&#40;</span><span style="color: #ff4500;">100</span>,<span style="color: #ff4500;">100</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        rotatedTxtBtn = SButton<span style="color: black;">&#40;</span>panel, label=<span style="color: #483d8b;">&quot;Rotated!&quot;</span>, size=size<span style="color: black;">&#41;</span>
        rotatedTxtBtn.<span style="color: black;">SetAngleOfRotation</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">90</span><span style="color: black;">&#41;</span>
&nbsp;
        sizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">HORIZONTAL</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>sBtn, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>, wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>bmpBtn, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>, wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>bmpToggleBtn, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>, wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>bmpToggleTxtBtn, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>, wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>rotatedTxtBtn, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>, wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        panel.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span>sizer<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onBmpShapedBtn<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        dlg = wx.<span style="color: black;">ColourDialog</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
        dlg.<span style="color: black;">GetColourData</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">SetChooseFull</span><span style="color: black;">&#40;</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> dlg.<span style="color: black;">ShowModal</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == wx.<span style="color: black;">ID_OK</span>:
            <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;'You selected: %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>data.<span style="color: black;">GetColour</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">Get</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        dlg.<span style="color: black;">Destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onToggle<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> event.<span style="color: black;">GetIsDown</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
            wx.<span style="color: black;">CallAfter</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">showDialog</span>, <span style="color: #483d8b;">&quot;You Toggled Me!&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            wx.<span style="color: black;">CallAfter</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">showDialog</span>, <span style="color: #483d8b;">&quot;You untoggled me!&quot;</span><span style="color: black;">&#41;</span>
        event.<span style="color: black;">Skip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onShapedBtn<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">showDialog</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;You Pressed the Normal ShapedButton!&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> showDialog<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, message<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        Displays a custom message
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        dlg = wx.<span style="color: black;">MessageDialog</span><span style="color: black;">&#40;</span><span style="color: #008000;">None</span>, message, <span style="color: #483d8b;">'Message'</span>,
                               wx.<span style="color: black;">OK</span>|wx.<span style="color: black;">ICON_EXCLAMATION</span><span style="color: black;">&#41;</span>
        dlg.<span style="color: black;">ShowModal</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        dlg.<span style="color: black;">Destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Run the program</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app = wx.<span style="color: black;">App</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
    frame = MyForm<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    frame.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>In the code above, you can see how to create a normal ShapedButton, a couple toggle buttons and one with some text that&#8217;s been rotated 90 degrees. To rotate said text, use the SetAngleOfRotation method and pass in the number of degrees to angle it. Currently there is some kind of bug related to Mouse/Window Capture with the toggle version of the ShapedButton. If you try to display a dialog in your button handler, like in the onToggle method above, you&#8217;ll get an error unless you wrap the call in wx.CallAfter. You can read more about the issue on the <a href="http://groups.google.com/group/wxpython-users/browse_frm/thread/f5051bf7cf601c6d#">wxPython mailing list</a>.</p>
<h2>Wrapping Up</h2>
<p>If you&#8217;ve read this far, then you now know something about almost all the button widgets in wxPython. Congratulations! I hope you have found this helpful and that in the future, you don&#8217;t take any widget for granted.</p>
<p><strong>Note: The code in this article was tested on the following:</strong></p>
<ul>
<li>Windows XP, wxPython 2.8.11.0, Python 2.5</li>
<li>Windows 7, wxPython 2.8.10.1, Python 2.6</li>
</ul>
<h2>Download the Source</h2>
<ul>
<li><a href='http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/tourOfButtons2.zip'>tourOfButtons2.zip</a></li>
<li><a href='http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/tourOfButtons2.tar'>tourOfButtons2.tar</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.blog.pythonlibrary.org/2010/06/10/wxpython-a-tour-of-buttons-part-2-of-2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>wxPython: A Tour of Buttons (Part 1 of 2)</title>
		<link>http://www.blog.pythonlibrary.org/2010/06/09/wxpython-a-tour-of-buttons-part-1-of-2/</link>
		<comments>http://www.blog.pythonlibrary.org/2010/06/09/wxpython-a-tour-of-buttons-part-1-of-2/#comments</comments>
		<pubDate>Wed, 09 Jun 2010 13:00:25 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[wxPython]]></category>

		<guid isPermaLink="false">http://www.blog.pythonlibrary.org/?p=921</guid>
		<description><![CDATA[Most people don&#8217;t really think about the widgets they use every day. Instead, they just take them for granted. The button is one of the most commonly used widgets that we use. From the keys on our keyboards to the buttons on door locks, we find them everywhere. They are even more prevalent in software [...]]]></description>
			<content:encoded><![CDATA[<p>Most people don&#8217;t really think about the widgets they use every day. Instead, they just take them for granted. The button is one of the most commonly used widgets that we use. From the keys on our keyboards to the buttons on door locks, we find them everywhere. They are even more prevalent in software where buttons can be practically any shape or size. Some buttons don&#8217;t even look like buttons! In this article, we&#8217;ll look at several buttons that wxPython provides for you and how to use them.<span id="more-921"></span></p>
<h2>The Common wx.Button Widget</h2>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/buttonTutorial.jpg"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/buttonTutorial.jpg" alt="" title="buttonTutorial" width="271" height="147" class="aligncenter size-full wp-image-932" /></a></p>
<p>The first button that most wxPython programmers will likely use is wx.Button. It wraps the native button control on the three major platforms and just looks &#8220;right&#8221; on each of them. Here&#8217;s a really simple example of how we would use one:</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> wx
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> MyForm<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>, <span style="color: #483d8b;">&quot;Button Tutorial&quot;</span><span style="color: black;">&#41;</span>
        panel = wx.<span style="color: black;">Panel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, wx.<span style="color: black;">ID_ANY</span><span style="color: black;">&#41;</span>
&nbsp;
        button = wx.<span style="color: black;">Button</span><span style="color: black;">&#40;</span>panel, <span style="color: #008000;">id</span>=wx.<span style="color: black;">ID_ANY</span>, label=<span style="color: #483d8b;">&quot;Press Me&quot;</span><span style="color: black;">&#41;</span>
        button.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onButton</span><span style="color: black;">&#41;</span>
        <span style="color: #808080; font-style: italic;"># self.Bind(wx.EVT_BUTTON, self.onButton, button)</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onButton<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        This method is fired when its corresponding button is pressed
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Button pressed!&quot;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Run the program</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app = wx.<span style="color: black;">App</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
    frame = MyForm<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    frame.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>All the code above does is create a simple form with one button. The button is bound to the <em>onButton</em> event handler. Notice that there is another way to bind that is commented out. Robin Dunn explains the difference between the two ways to bind an event on the <a href="http://wiki.wxpython.org/self.Bind%20vs.%20self.button.Bind">wiki</a>, so if you don&#8217;t understand it, go check it out! If you don&#8217;t feel like getting the full explanation, here&#8217;s my take:</p>
<ul>
<li>self.Bind will bind the event to the parent (usually a wx.Frame) via the button. This means that the event may have to float up through several event layers before it reaches the parent. If anywhere in those layers of handlers, the developer does not call event.Skip(), then the event stops.</li>
<li>widget.Bind for all intents and purposes, binds the event to just that widget. If you want, you can call event.Skip() here to pass the event onwards and upwards, although I can&#8217;t think of a time when I&#8217;ve needed to do that with a button event.</li>
</ul>
<h2>Binding Multiple Widgets to the Same Handler</h2>
<p>It&#8217;s fairly common practice to need to bind multiple widgets to just one handler and then differentiate between the calling widgets from within the handler. There are several ways to get the required information. We&#8217;ll look at a couple of the most popular ways to actually get the widget itself:</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> wx
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> MyForm<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>, <span style="color: #483d8b;">&quot;Button Tutorial&quot;</span><span style="color: black;">&#41;</span>
        panel = wx.<span style="color: black;">Panel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, wx.<span style="color: black;">ID_ANY</span><span style="color: black;">&#41;</span>
&nbsp;
        sizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        buttonOne = wx.<span style="color: black;">Button</span><span style="color: black;">&#40;</span>panel, <span style="color: #008000;">id</span>=wx.<span style="color: black;">ID_ANY</span>, label=<span style="color: #483d8b;">&quot;One&quot;</span>, name=<span style="color: #483d8b;">&quot;one&quot;</span><span style="color: black;">&#41;</span>
        buttonTwo = wx.<span style="color: black;">Button</span><span style="color: black;">&#40;</span>panel, <span style="color: #008000;">id</span>=wx.<span style="color: black;">ID_ANY</span>, label=<span style="color: #483d8b;">&quot;Two&quot;</span>, name=<span style="color: #483d8b;">&quot;two&quot;</span><span style="color: black;">&#41;</span>
        buttonThree = wx.<span style="color: black;">Button</span><span style="color: black;">&#40;</span>panel, <span style="color: #008000;">id</span>=wx.<span style="color: black;">ID_ANY</span>, label=<span style="color: #483d8b;">&quot;Three&quot;</span>, name=<span style="color: #483d8b;">&quot;three&quot;</span><span style="color: black;">&#41;</span>
        buttons = <span style="color: black;">&#91;</span>buttonOne, buttonTwo, buttonThree<span style="color: black;">&#93;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">for</span> button <span style="color: #ff7700;font-weight:bold;">in</span> buttons:
            <span style="color: #008000;">self</span>.<span style="color: black;">buildButtons</span><span style="color: black;">&#40;</span>button, sizer<span style="color: black;">&#41;</span>
&nbsp;
        panel.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span>sizer<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> buildButtons<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, btn, sizer<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        btn.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onButton</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>btn, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onButton<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        This method is fired when its corresponding button is pressed
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        button = event.<span style="color: black;">GetEventObject</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;The button you pressed was labeled: &quot;</span> + button.<span style="color: black;">GetLabel</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;The button's name is &quot;</span> + button.<span style="color: black;">GetName</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        button_id = event.<span style="color: black;">GetId</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        button_by_id = <span style="color: #008000;">self</span>.<span style="color: black;">FindWindowById</span><span style="color: black;">&#40;</span>button_id<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;The button you pressed was labeled: &quot;</span> + button_by_id.<span style="color: black;">GetLabel</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;The button's name is &quot;</span> + button_by_id.<span style="color: black;">GetName</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Run the program</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app = wx.<span style="color: black;">App</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
    frame = MyForm<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    frame.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>Here we have three buttons, each bound to the <em>onButton</em> event handler. There are two ways to get the button object: </p>
<ol>
<li>event.GetEventObject()</li>
<li>self.FindWindowById(button_id)</li>
</ol>
<p>The first gets the widget directly in one fell swoop. The second requires us to get the widget ID using <em>event.GetId</em>. Either way, once you have the button, you can call any of its methods. In our example, we get the button&#8217;s name and current label. We can also change the button&#8217;s label or other attributes by using the appropriate setter method (i.e. SetLabel). Now let&#8217;s turn our attention to some of the other buttons available to us.</p>
<h2>Toggle Buttons and Bitmap Buttons</h2>
<div id="attachment_931" class="wp-caption aligncenter" style="width: 410px"><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/togglebitmap.jpg"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/togglebitmap.jpg" alt="" title="togglebitmap" width="400" height="250" class="size-full wp-image-931" /></a><p class="wp-caption-text">Toggle / Bitmap Button Example</p></div>
<p>The second most popular button is probably a toss-up between Toggle Buttons and Bitmap Buttons. With wxPython, you have two choices for both types of buttons: Use the native versions (where possible) or use one of the generic versions (i.e. buttons written in pure Python rather than SWIGed). Let&#8217;s look at all four:</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> wx
<span style="color: #ff7700;font-weight:bold;">import</span> wx.<span style="color: black;">lib</span>.<span style="color: black;">buttons</span> as buttons
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> MyForm<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>, <span style="color: #483d8b;">&quot;Button Tutorial&quot;</span><span style="color: black;">&#41;</span>
        panel = wx.<span style="color: black;">Panel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, wx.<span style="color: black;">ID_ANY</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># create a normal toggle button</span>
        button = wx.<span style="color: black;">ToggleButton</span><span style="color: black;">&#40;</span>panel, label=<span style="color: #483d8b;">&quot;Press Me&quot;</span><span style="color: black;">&#41;</span>
        button.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_TOGGLEBUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onToggle</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># create a generic toggle button</span>
        gen_toggle_button = buttons.<span style="color: black;">GenToggleButton</span><span style="color: black;">&#40;</span>panel, <span style="color: #ff4500;">-1</span>, <span style="color: #483d8b;">&quot;Generic Toggle&quot;</span><span style="color: black;">&#41;</span>
        gen_toggle_button.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onGenericToggle</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># create a normal bitmap button</span>
        bmp = wx.<span style="color: black;">Bitmap</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;agt_mp3.png&quot;</span>, wx.<span style="color: black;">BITMAP_TYPE_ANY</span><span style="color: black;">&#41;</span>
        bmapBtn = wx.<span style="color: black;">BitmapButton</span><span style="color: black;">&#40;</span>panel, <span style="color: #008000;">id</span>=wx.<span style="color: black;">ID_ANY</span>, bitmap=bmp,
                                  size=<span style="color: black;">&#40;</span>bmp.<span style="color: black;">GetWidth</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: #ff4500;">+10</span>, bmp.<span style="color: black;">GetHeight</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: #ff4500;">+10</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># create a generic bitmap button</span>
        genBmapBtn = buttons.<span style="color: black;">GenBitmapButton</span><span style="color: black;">&#40;</span>panel, bitmap=bmp<span style="color: black;">&#41;</span>
&nbsp;
        sizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>button, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>gen_toggle_button, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>bmapBtn, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>genBmapBtn, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        panel.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span>sizer<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onGenericToggle<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, eventq<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Generic toggle button was pressed!&quot;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onToggle<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        Print a message when toggled
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Button toggled!&quot;</span>
&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;"># Run the program</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app = wx.<span style="color: black;">App</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
    frame = MyForm<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    frame.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>This code is pretty similar to what we&#8217;ve already seen. The new piece of information is how to get at the generic buttons. We need to do a special import, like this: import wx.lib.buttons. Now we have access to a bunch of generic buttons including a normal button, a toggle, a bitmap, a bitmap with text and flat buttons. There are even a couple of themed buttons that look almost like the native buttons! </p>
<p>Let&#8217;s take note of a couple idiosyncrasies in the code above. First, there&#8217;s the strange sizing we do with the wx.BitmapButton widget. We do it this way to make sure that there&#8217;s some &#8220;white&#8221; space around the bitmap. This makes it easier to tell that the widget is a button. The generic version seems to do this automatically. The other odd thing that is that when you toggle the wx.ToggleButton button and keep the mouse pointer above the button, it doesn&#8217;t look toggled. If you mouse off the button, then it does (I noticed this on Windows XP&#8230;it may not be an issue on other platforms).</p>
<p>According to <a href="http://groups.google.com/group/wxpython-users/browse_frm/thread/89a4624c2bbb29d5/bf067b3d63ffa47f#bf067b3d63ffa47f">Robin Dunn</a> (creator of wxPython), the 2.9 series of wxPython will have an updated wx.Button control that can display a bitmap along with its text. Now that&#8217;s something to look forward to!</p>
<h2>The PlateButton</h2>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/platebutton.jpg"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/06/platebutton.jpg" alt="" title="platebutton" width="305" height="116" class="aligncenter size-full wp-image-933" /></a></p>
<p>The PlateButton is another generic widget. It was created by Cody Precord, author of <a href="http://editra.org/">Editra</a>. There are tons of examples of his button in the wxPython demo. We&#8217;ll look at just a couple:</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> wx
<span style="color: #ff7700;font-weight:bold;">import</span> wx.<span style="color: black;">lib</span>.<span style="color: black;">platebtn</span> as platebtn
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> MyForm<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>, <span style="color: #483d8b;">&quot;Plate Button Tutorial&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># Add a panel so it looks the correct on all platforms</span>
        panel = wx.<span style="color: black;">Panel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, wx.<span style="color: black;">ID_ANY</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">##        btn = platebtn.PlateButton(panel, label=&quot;Test&quot;, style=platebtn.PB_STYLE_DEFAULT)</span>
        btn = platebtn.<span style="color: black;">PlateButton</span><span style="color: black;">&#40;</span>panel, label=<span style="color: #483d8b;">&quot;Gradient&quot;</span>, style=platebtn.<span style="color: black;">PB_STYLE_GRADIENT</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Run the program</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app = wx.<span style="color: black;">App</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
    frame = MyForm<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>The example above shows how to create a simple PlateButton. Included are two examples that show two different button styles. You&#8217;ll need to uncomment one and comment out the other to see how they differ. Now let&#8217;s see how we can add a menu to our PlateButton:</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> wx
<span style="color: #ff7700;font-weight:bold;">import</span> wx.<span style="color: black;">lib</span>.<span style="color: black;">platebtn</span> as platebtn
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> MyForm<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>, <span style="color: #483d8b;">&quot;Plate Button Tutorial&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># Add a panel so it looks the correct on all platforms</span>
        panel = wx.<span style="color: black;">Panel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, wx.<span style="color: black;">ID_ANY</span><span style="color: black;">&#41;</span>
&nbsp;
        menu = wx.<span style="color: black;">Menu</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> url <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: black;">&#91;</span><span style="color: #483d8b;">'http://wxpython.org'</span>, <span style="color: #483d8b;">'http://slashdot.org'</span>,
                    <span style="color: #483d8b;">'http://editra.org'</span>, <span style="color: #483d8b;">'http://xkcd.com'</span><span style="color: black;">&#93;</span>:
            menu.<span style="color: black;">Append</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">NewId</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, url, <span style="color: #483d8b;">&quot;Open %s in your browser&quot;</span> <span style="color: #66cc66;">%</span> url<span style="color: black;">&#41;</span>
&nbsp;
        btn = platebtn.<span style="color: black;">PlateButton</span><span style="color: black;">&#40;</span>panel, label=<span style="color: #483d8b;">&quot;Menu&quot;</span>, size=<span style="color: #008000;">None</span>, style=platebtn.<span style="color: black;">PB_STYLE_DEFAULT</span><span style="color: black;">&#41;</span>
        btn.<span style="color: black;">SetMenu</span><span style="color: black;">&#40;</span>menu<span style="color: black;">&#41;</span>
&nbsp;
        sizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>btn, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        panel.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span>sizer<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Run the program</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app = wx.<span style="color: black;">PySimpleApp</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    frame = MyForm<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>This sample is basically a stripped down example from the wxPython demo. The idea here is to create a menu and then use the PlateButton&#8217;s &#8220;SetMenu&#8221; method to attach it to the button.</p>
<h2>Wrapping Up</h2>
<p>In this article, we learned about the following buttons: wx.Button, wx.ToggleButton, wx.BitmapButton, a couple generic buttons and the PlateButton. In the second half, we&#8217;ll look at a couple more core widget buttons and Andrea Gavana&#8217;s buttons! See you next time!</p>
<p><em>Note: The examples in this article were tested on Windows XP, wxPython 2.8.10.1 / 2.8.11.0 and Python 2.5</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.blog.pythonlibrary.org/2010/06/09/wxpython-a-tour-of-buttons-part-1-of-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Python: Running Ping, Traceroute and More</title>
		<link>http://www.blog.pythonlibrary.org/2010/06/05/python-running-ping-traceroute-and-more/</link>
		<comments>http://www.blog.pythonlibrary.org/2010/06/05/python-running-ping-traceroute-and-more/#comments</comments>
		<pubDate>Sat, 05 Jun 2010 12:42:18 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[System Administration]]></category>
		<category><![CDATA[wxPython]]></category>
		<category><![CDATA[System Admin]]></category>

		<guid isPermaLink="false">http://www.blog.pythonlibrary.org/?p=907</guid>
		<description><![CDATA[Last year I needed to figure out a way to get the following information with Python: get the route table, capture the data from pinging a series of IPs, run tracert and get information about the NIC(s) installed. This all needed to be done on a Windows machine as it was part of a diagnostics [...]]]></description>
			<content:encoded><![CDATA[<p>Last year I needed to figure out a way to get the following information with Python: get the route table, capture the data from pinging a series of IPs, run tracert and get information about the NIC(s) installed. This all needed to be done on a Windows machine as it was part of a diagnostics script to try to figure out why the machine (usually a laptop) wouldn&#8217;t connect to our VPN. I ended up creating a wxPython GUI to make it easy for the user to run, but these scripts will work just fine without wx. Let&#8217;s see what they look like!<span id="more-907"></span></p>
<h2>The Main Script</h2>
<p>To start with, we&#8217;ll look at the entire script and then go over each important piece. If you&#8217;d like to use the code below, you will need <a href="http://www.wxpython.org">wxPython</a> and the <a href="http://sourceforge.net/projects/pywin32/files/pywin32/">PyWin32</a> package.</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">subprocess</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span>
<span style="color: #ff7700;font-weight:bold;">import</span> win32com.<span style="color: black;">client</span>
<span style="color: #ff7700;font-weight:bold;">import</span> win32net
<span style="color: #ff7700;font-weight:bold;">import</span> wx
&nbsp;
filename = r<span style="color: #483d8b;">&quot;C:<span style="color: #000099; font-weight: bold;">\l</span>ogs<span style="color: #000099; font-weight: bold;">\n</span>ic-diag.log&quot;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> RedirectText:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>,aWxTextCtrl<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">out</span>=aWxTextCtrl
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">exists</span><span style="color: black;">&#40;</span>r<span style="color: #483d8b;">&quot;C:<span style="color: #000099; font-weight: bold;">\l</span>ogs&quot;</span><span style="color: black;">&#41;</span>:
            <span style="color: #dc143c;">os</span>.<span style="color: black;">mkdir</span><span style="color: black;">&#40;</span>r<span style="color: #483d8b;">&quot;C:<span style="color: #000099; font-weight: bold;">\l</span>ogs&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">filename</span> = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>filename, <span style="color: #483d8b;">&quot;w&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> write<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>,<span style="color: #dc143c;">string</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">out</span>.<span style="color: black;">WriteText</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">string</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">filename</span>.<span style="color: black;">closed</span>:
            <span style="color: #ff7700;font-weight:bold;">pass</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">filename</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">string</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> MyForm<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #808080; font-style: italic;">#---------------------------------------------------------------------- </span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>, <span style="color: #483d8b;">&quot;Diagnostic Tool&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># Add a panel so it looks the correct on all platforms</span>
        panel = wx.<span style="color: black;">Panel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, wx.<span style="color: black;">ID_ANY</span><span style="color: black;">&#41;</span>
        log = wx.<span style="color: black;">TextCtrl</span><span style="color: black;">&#40;</span>panel, wx.<span style="color: black;">ID_ANY</span>, size=<span style="color: black;">&#40;</span><span style="color: #ff4500;">300</span>,<span style="color: #ff4500;">100</span><span style="color: black;">&#41;</span>,
                          style = wx.<span style="color: black;">TE_MULTILINE</span>|wx.<span style="color: black;">TE_READONLY</span>|wx.<span style="color: black;">HSCROLL</span><span style="color: black;">&#41;</span>
        <span style="color: #808080; font-style: italic;"># log.Disable()</span>
        btn = wx.<span style="color: black;">Button</span><span style="color: black;">&#40;</span>panel, wx.<span style="color: black;">ID_ANY</span>, <span style="color: #483d8b;">'Run Diagnostics'</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onRun</span>, btn<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># Add widgets to a sizer        </span>
        sizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>log, <span style="color: #ff4500;">1</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">EXPAND</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>btn, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        panel.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span>sizer<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># redirect text here</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">redir</span>=RedirectText<span style="color: black;">&#40;</span>log<span style="color: black;">&#41;</span>
        <span style="color: #dc143c;">sys</span>.<span style="color: black;">stdout</span>=<span style="color: #008000;">self</span>.<span style="color: black;">redir</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------    </span>
    <span style="color: #ff7700;font-weight:bold;">def</span> runDiagnostics<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        Run some diagnostics to get the machine name, ip address, mac,
        gateway, DNS, route tables, etc
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        <span style="color: #808080; font-style: italic;"># create the route table:</span>
        <span style="color: #808080; font-style: italic;"># based on the following list comp from http://win32com.goermezer.de/content/view/220/284/</span>
        <span style="color: #808080; font-style: italic;"># route_table = [elem.strip().split() for elem in os.popen(&quot;route print&quot;).read().split(&quot;Metric\n&quot;)[1].split(&quot;\n&quot;) if re.match(&quot;^[0-9]&quot;, elem.strip())]</span>
        route_table = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
        proc = <span style="color: #dc143c;">subprocess</span>.<span style="color: black;">Popen</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;route print&quot;</span>, shell=<span style="color: #008000;">True</span>,
                        stdout=<span style="color: #dc143c;">subprocess</span>.<span style="color: black;">PIPE</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #008000;">True</span>:
            line = proc.<span style="color: black;">stdout</span>.<span style="color: #dc143c;">readline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            route_table.<span style="color: black;">append</span><span style="color: black;">&#40;</span>line.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> line: <span style="color: #ff7700;font-weight:bold;">break</span>
        proc.<span style="color: black;">wait</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Log Created at %s&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: #dc143c;">time</span>.<span style="color: black;">ctime</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;----------------------------------------------------------------------------------------------&quot;</span>
        info = win32net.<span style="color: black;">NetWkstaGetInfo</span><span style="color: black;">&#40;</span><span style="color: #008000;">None</span>, <span style="color: #ff4500;">102</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">compname</span> = info<span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;computername&quot;</span><span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Computer name: %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">self</span>.<span style="color: black;">compname</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;----------------------------------------------------------------------------------------------&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Route Table:&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;%20s<span style="color: #000099; font-weight: bold;">\t</span> %15s<span style="color: #000099; font-weight: bold;">\t</span> %15s<span style="color: #000099; font-weight: bold;">\t</span> %15s<span style="color: #000099; font-weight: bold;">\t</span> %s&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Network Destination&quot;</span>, <span style="color: #483d8b;">&quot;Netmask&quot;</span>,
                                          <span style="color: #483d8b;">&quot;Gateway&quot;</span>, <span style="color: #483d8b;">&quot;Interface&quot;</span>, <span style="color: #483d8b;">&quot;Metric&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> route <span style="color: #ff7700;font-weight:bold;">in</span> route_table:
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>route<span style="color: black;">&#41;</span> == <span style="color: #ff4500;">5</span>:
                dst, mask, gateway, interface, metric = route
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;%20s<span style="color: #000099; font-weight: bold;">\t</span> %15s<span style="color: #000099; font-weight: bold;">\t</span> %15s<span style="color: #000099; font-weight: bold;">\t</span> %15s<span style="color: #000099; font-weight: bold;">\t</span> %s&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>dst, mask, gateway, interface, metric<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;----------------------------------------------------------------------------------------------<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
        ips = <span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;65.55.17.26&quot;</span>, <span style="color: #483d8b;">&quot;67.205.46.185&quot;</span>, <span style="color: #483d8b;">&quot;67.195.160.76&quot;</span><span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> ip <span style="color: #ff7700;font-weight:bold;">in</span> ips:
            <span style="color: #008000;">self</span>.<span style="color: black;">pingIP</span><span style="color: black;">&#40;</span>ip<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">print</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">tracertIP</span><span style="color: black;">&#40;</span>ip<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>----------------------------------------------------------&quot;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">getNICInfo</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;############ END OF LOG ############&quot;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------   </span>
    <span style="color: #ff7700;font-weight:bold;">def</span> pingIP<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, ip<span style="color: black;">&#41;</span>:
        proc = <span style="color: #dc143c;">subprocess</span>.<span style="color: black;">Popen</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;ping %s&quot;</span> <span style="color: #66cc66;">%</span> ip, shell=<span style="color: #008000;">True</span>,
                                stdout=<span style="color: #dc143c;">subprocess</span>.<span style="color: black;">PIPE</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span>
        <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #008000;">True</span>:
            line = proc.<span style="color: black;">stdout</span>.<span style="color: #dc143c;">readline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            wx.<span style="color: black;">Yield</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> line.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == <span style="color: #483d8b;">&quot;&quot;</span>:
                <span style="color: #ff7700;font-weight:bold;">pass</span>
            <span style="color: #ff7700;font-weight:bold;">else</span>:
                <span style="color: #ff7700;font-weight:bold;">print</span> line.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> line: <span style="color: #ff7700;font-weight:bold;">break</span>
        proc.<span style="color: black;">wait</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> tracertIP<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, ip<span style="color: black;">&#41;</span>:
        proc = <span style="color: #dc143c;">subprocess</span>.<span style="color: black;">Popen</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;tracert -d %s&quot;</span> <span style="color: #66cc66;">%</span> ip, shell=<span style="color: #008000;">True</span>,
                                stdout=<span style="color: #dc143c;">subprocess</span>.<span style="color: black;">PIPE</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span>
        <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #008000;">True</span>:
            line = proc.<span style="color: black;">stdout</span>.<span style="color: #dc143c;">readline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            wx.<span style="color: black;">Yield</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> line.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == <span style="color: #483d8b;">&quot;&quot;</span>:
                <span style="color: #ff7700;font-weight:bold;">pass</span>
            <span style="color: #ff7700;font-weight:bold;">else</span>:
                <span style="color: #ff7700;font-weight:bold;">print</span> line.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> line: <span style="color: #ff7700;font-weight:bold;">break</span>
        proc.<span style="color: black;">wait</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------            </span>
    <span style="color: #ff7700;font-weight:bold;">def</span> getNICInfo<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;

http://www.microsoft.com/technet/scriptcenter/scripts/python/pyindex.mspx?mfr=true

        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>Interface information:<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
        strComputer = <span style="color: #483d8b;">&quot;.&quot;</span>
        objWMIService = win32com.<span style="color: black;">client</span>.<span style="color: black;">Dispatch</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;WbemScripting.SWbemLocator&quot;</span><span style="color: black;">&#41;</span>
        objSWbemServices = objWMIService.<span style="color: black;">ConnectServer</span><span style="color: black;">&#40;</span>strComputer,<span style="color: #483d8b;">&quot;root<span style="color: #000099; font-weight: bold;">\c</span>imv2&quot;</span><span style="color: black;">&#41;</span>
        colItems = objSWbemServices.<span style="color: black;">ExecQuery</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Select * from Win32_NetworkAdapterConfiguration&quot;</span><span style="color: black;">&#41;</span>
        numOfNics = <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>colItems<span style="color: black;">&#41;</span>
        count = <span style="color: #ff4500;">1</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> objItem <span style="color: #ff7700;font-weight:bold;">in</span> colItems:
            <span style="color: #808080; font-style: italic;"># if the IP interface is enabled, grab its info</span>
            <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;***Interface %s of %s***&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>count, numOfNics<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> objItem.<span style="color: black;">IPEnabled</span> == <span style="color: #008000;">True</span>:
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Arp Always Source Route: &quot;</span>, objItem.<span style="color: black;">ArpAlwaysSourceRoute</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Arp Use EtherSNAP: &quot;</span>, objItem.<span style="color: black;">ArpUseEtherSNAP</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Caption: &quot;</span>, objItem.<span style="color: black;">Caption</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Database Path: &quot;</span>, objItem.<span style="color: black;">DatabasePath</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Dead GW Detect Enabled: &quot;</span>, objItem.<span style="color: black;">DeadGWDetectEnabled</span>
                z = objItem.<span style="color: black;">DefaultIPGateway</span>
                <span style="color: #ff7700;font-weight:bold;">if</span> z <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
                    a = <span style="color: #ff4500;">1</span>
                <span style="color: #ff7700;font-weight:bold;">else</span>:
                    <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> z:
                        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Default IP Gateway: &quot;</span>, x
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Default TOS: &quot;</span>, objItem.<span style="color: black;">DefaultTOS</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Default TTL: &quot;</span>, objItem.<span style="color: black;">DefaultTTL</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Description: &quot;</span>, objItem.<span style="color: black;">Description</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;DHCP Enabled: &quot;</span>, objItem.<span style="color: black;">DHCPEnabled</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;DHCP Lease Expires: &quot;</span>, objItem.<span style="color: black;">DHCPLeaseExpires</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;DHCP Lease Obtained: &quot;</span>, objItem.<span style="color: black;">DHCPLeaseObtained</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;DHCP Server: &quot;</span>, objItem.<span style="color: black;">DHCPServer</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;DNS Domain: &quot;</span>, objItem.<span style="color: black;">DNSDomain</span>
                z = objItem.<span style="color: black;">DNSDomainSuffixSearchOrder</span>
                <span style="color: #ff7700;font-weight:bold;">if</span> z <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
                    a = <span style="color: #ff4500;">1</span>
                <span style="color: #ff7700;font-weight:bold;">else</span>:
                    <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> z:
                        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;DNS Domain Suffix Search Order: &quot;</span>, x
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;DNS Enabled For WINS Resolution: &quot;</span>, objItem.<span style="color: black;">DNSEnabledForWINSResolution</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;DNS Host Name: &quot;</span>, objItem.<span style="color: black;">DNSHostName</span>
                z = objItem.<span style="color: black;">DNSServerSearchOrder</span>
                <span style="color: #ff7700;font-weight:bold;">if</span> z <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
                    a = <span style="color: #ff4500;">1</span>
                <span style="color: #ff7700;font-weight:bold;">else</span>:
                    <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> z:
                        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;DNS Server Search Order: &quot;</span>, x
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Domain DNS Registration Enabled: &quot;</span>, objItem.<span style="color: black;">DomainDNSRegistrationEnabled</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Forward Buffer Memory: &quot;</span>, objItem.<span style="color: black;">ForwardBufferMemory</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Full DNS Registration Enabled: &quot;</span>, objItem.<span style="color: black;">FullDNSRegistrationEnabled</span>
                z = objItem.<span style="color: black;">GatewayCostMetric</span>
                <span style="color: #ff7700;font-weight:bold;">if</span> z <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
                    a = <span style="color: #ff4500;">1</span>
                <span style="color: #ff7700;font-weight:bold;">else</span>:
                    <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> z:
                        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Gateway Cost Metric: &quot;</span>, x
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;IGMP Level: &quot;</span>, objItem.<span style="color: black;">IGMPLevel</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Index: &quot;</span>, objItem.<span style="color: black;">Index</span>
                z = objItem.<span style="color: black;">IPAddress</span>
                <span style="color: #ff7700;font-weight:bold;">if</span> z <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
                    a = <span style="color: #ff4500;">1</span>
                <span style="color: #ff7700;font-weight:bold;">else</span>:
                    <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> z:
                        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;IP Address: &quot;</span>, x
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;IP Connection Metric: &quot;</span>, objItem.<span style="color: black;">IPConnectionMetric</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;IP Enabled: &quot;</span>, objItem.<span style="color: black;">IPEnabled</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;IP Filter Security Enabled: &quot;</span>, objItem.<span style="color: black;">IPFilterSecurityEnabled</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;IP Port Security Enabled: &quot;</span>, objItem.<span style="color: black;">IPPortSecurityEnabled</span>
                z = objItem.<span style="color: black;">IPSecPermitIPProtocols</span>
                <span style="color: #ff7700;font-weight:bold;">if</span> z <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
                    a = <span style="color: #ff4500;">1</span>
                <span style="color: #ff7700;font-weight:bold;">else</span>:
                    <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> z:
                        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;IP Sec Permit IP Protocols: &quot;</span>, x
                z = objItem.<span style="color: black;">IPSecPermitTCPPorts</span>
                <span style="color: #ff7700;font-weight:bold;">if</span> z <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
                    a = <span style="color: #ff4500;">1</span>
                <span style="color: #ff7700;font-weight:bold;">else</span>:
                    <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> z:
                        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;IP Sec Permit TCP Ports: &quot;</span>, x
                z = objItem.<span style="color: black;">IPSecPermitUDPPorts</span>
                <span style="color: #ff7700;font-weight:bold;">if</span> z <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
                    a = <span style="color: #ff4500;">1</span>
                <span style="color: #ff7700;font-weight:bold;">else</span>:
                    <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> z:
                        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;IPSec Permit UDP Ports: &quot;</span>, x
                z = objItem.<span style="color: black;">IPSubnet</span>
                <span style="color: #ff7700;font-weight:bold;">if</span> z <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
                    a = <span style="color: #ff4500;">1</span>
                <span style="color: #ff7700;font-weight:bold;">else</span>:
                    <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> z:
                        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;IP Subnet: &quot;</span>, x
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;IP Use Zero Broadcast: &quot;</span>, objItem.<span style="color: black;">IPUseZeroBroadcast</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;IPX Address: &quot;</span>, objItem.<span style="color: black;">IPXAddress</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;IPX Enabled: &quot;</span>, objItem.<span style="color: black;">IPXEnabled</span>
                z = objItem.<span style="color: black;">IPXFrameType</span>
                <span style="color: #ff7700;font-weight:bold;">if</span> z <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
                    a = <span style="color: #ff4500;">1</span>
                <span style="color: #ff7700;font-weight:bold;">else</span>:
                    <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> z:
                        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;IPX Frame Type: &quot;</span>, x
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;IPX Media Type: &quot;</span>, objItem.<span style="color: black;">IPXMediaType</span>
                z = objItem.<span style="color: black;">IPXNetworkNumber</span>
                <span style="color: #ff7700;font-weight:bold;">if</span> z <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
                    a = <span style="color: #ff4500;">1</span>
                <span style="color: #ff7700;font-weight:bold;">else</span>:
                    <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> z:
                        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;IPX Network Number: &quot;</span>, x
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;IPX Virtual Net Number: &quot;</span>, objItem.<span style="color: black;">IPXVirtualNetNumber</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Keep Alive Interval: &quot;</span>, objItem.<span style="color: black;">KeepAliveInterval</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Keep Alive Time: &quot;</span>, objItem.<span style="color: black;">KeepAliveTime</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;MAC Address: &quot;</span>, objItem.<span style="color: black;">MACAddress</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;MTU: &quot;</span>, objItem.<span style="color: black;">MTU</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Num Forward Packets: &quot;</span>, objItem.<span style="color: black;">NumForwardPackets</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;PMTUBH Detect Enabled: &quot;</span>, objItem.<span style="color: black;">PMTUBHDetectEnabled</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;PMTU Discovery Enabled: &quot;</span>, objItem.<span style="color: black;">PMTUDiscoveryEnabled</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Service Name: &quot;</span>, objItem.<span style="color: black;">ServiceName</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Setting ID: &quot;</span>, objItem.<span style="color: black;">SettingID</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Tcpip Netbios Options: &quot;</span>, objItem.<span style="color: black;">TcpipNetbiosOptions</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Tcp Max Connect Retransmissions: &quot;</span>, objItem.<span style="color: black;">TcpMaxConnectRetransmissions</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Tcp Max Data Retransmissions: &quot;</span>, objItem.<span style="color: black;">TcpMaxDataRetransmissions</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Tcp Num Connections: &quot;</span>, objItem.<span style="color: black;">TcpNumConnections</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Tcp Use RFC1122 Urgent Pointer: &quot;</span>, objItem.<span style="color: black;">TcpUseRFC1122UrgentPointer</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Tcp Window Size: &quot;</span>, objItem.<span style="color: black;">TcpWindowSize</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;WINS Enable LMHosts Lookup: &quot;</span>, objItem.<span style="color: black;">WINSEnableLMHostsLookup</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;WINS Host Lookup File: &quot;</span>, objItem.<span style="color: black;">WINSHostLookupFile</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;WINS Primary Server: &quot;</span>, objItem.<span style="color: black;">WINSPrimaryServer</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;WINS Scope ID: &quot;</span>, objItem.<span style="color: black;">WINSScopeID</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;WINS Secondary Server: &quot;</span>, objItem.<span style="color: black;">WINSSecondaryServer</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;-------------------------------------------------------<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
            <span style="color: #ff7700;font-weight:bold;">else</span>:
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Interface is disabled!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
            count += <span style="color: #ff4500;">1</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onRun<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">runDiagnostics</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">redir</span>.<span style="color: black;">filename</span>.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #808080; font-style: italic;"># Restore stdout to normal</span>
        <span style="color: #dc143c;">sys</span>.<span style="color: black;">stdout</span> = <span style="color: #dc143c;">sys</span>.__stdout__
&nbsp;
<span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------         </span>
<span style="color: #808080; font-style: italic;"># Run the program</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app = wx.<span style="color: black;">PySimpleApp</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    frame = MyForm<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>As with most Python programs, this one starts out with various imports. Next we create a a simple class (RedirectText) that we will use to help us redirect stdout to a wx.TextCtrl and a log file. This works by passing in an instance of wx.TextCtrl and then setting &#8220;sys.stdout&#8221; to point to it (see the __init__ method in the MyForm class). Following the <em>RedirectText</em> class, we have the <em>MyForm</em> class which is where we create out wxPython GUI. There&#8217;s actually not much to the GUI itself. Just a multi-line text control and a button on a panel, but that&#8217;s all we need. The rest of the class is made up of methods that gather all our required information and log it to the screen and to a file.</p>
<p>Let&#8217;s take a look at those methods now! Note that these methods are called from the <em>runDiagnostics</em> method which is launched from the <em>onRun</em> button event handler.</p>
<h2>Getting the Route Table (AKA: IP Routes)</h2>
<p>When I looked into how to do this, I found the following script on another <a href="http://win32com.goermezer.de/content/view/220/284/">blog</a>:</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>, <span style="color: #dc143c;">re</span>
route_table = <span style="color: black;">&#91;</span>elem.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> elem <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">popen</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;route print&quot;</span><span style="color: black;">&#41;</span>.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Metric<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #dc143c;">re</span>.<span style="color: black;">match</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;^[0-9]&quot;</span>, elem.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span></pre>
<p>I found that rather hard to follow, so I re-wrote it (or found another example and forgot to make a note of it) like this:</p>
<pre class="python">route_table = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
proc = <span style="color: #dc143c;">subprocess</span>.<span style="color: black;">Popen</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;route print&quot;</span>, shell=<span style="color: #008000;">True</span>,
                stdout=<span style="color: #dc143c;">subprocess</span>.<span style="color: black;">PIPE</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #008000;">True</span>:
    line = proc.<span style="color: black;">stdout</span>.<span style="color: #dc143c;">readline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    route_table.<span style="color: black;">append</span><span style="color: black;">&#40;</span>line.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> line: <span style="color: #ff7700;font-weight:bold;">break</span>
proc.<span style="color: black;">wait</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;----------------------------------------------------------------------------------------------&quot;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Route Table:&quot;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;%20s<span style="color: #000099; font-weight: bold;">\t</span> %15s<span style="color: #000099; font-weight: bold;">\t</span> %15s<span style="color: #000099; font-weight: bold;">\t</span> %15s<span style="color: #000099; font-weight: bold;">\t</span> %s&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Network Destination&quot;</span>, <span style="color: #483d8b;">&quot;Netmask&quot;</span>,
                                  <span style="color: #483d8b;">&quot;Gateway&quot;</span>, <span style="color: #483d8b;">&quot;Interface&quot;</span>, <span style="color: #483d8b;">&quot;Metric&quot;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">for</span> route <span style="color: #ff7700;font-weight:bold;">in</span> route_table:
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>route<span style="color: black;">&#41;</span> == <span style="color: #ff4500;">5</span>:
        dst, mask, gateway, interface, metric = route
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;%20s<span style="color: #000099; font-weight: bold;">\t</span> %15s<span style="color: #000099; font-weight: bold;">\t</span> %15s<span style="color: #000099; font-weight: bold;">\t</span> %15s<span style="color: #000099; font-weight: bold;">\t</span> %s&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>dst, mask, gateway, interface, metric<span style="color: black;">&#41;</span></pre>
<p>I find the code above much easier to read and understand. All it does is use the subprocess module to run &#8220;route print&#8221; and write the result to stdout. Don&#8217;t be confused by the <em>proc.stdout</em> above. That&#8217;s the process&#8217;s stdout, not the normal stdout. We want to redirect that data to the normal stdout! To do that, we read the proc&#8217;s stdout (or some might say, the PIPE) and append each line of data to a list. Then we create a nice custom output using Python&#8217;s string formatting. Now let&#8217;s take a look at how to use Python to run Ping and Tracert.</p>
<h2>Running Ping / Tracert with Python</h2>
<p>Pinging with Python is pretty easy. We just need the subprocess module to do it as you can see from this snippet:</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">def</span> pingIP<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, ip<span style="color: black;">&#41;</span>:
    proc = <span style="color: #dc143c;">subprocess</span>.<span style="color: black;">Popen</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;ping %s&quot;</span> <span style="color: #66cc66;">%</span> ip, shell=<span style="color: #008000;">True</span>,
                            stdout=<span style="color: #dc143c;">subprocess</span>.<span style="color: black;">PIPE</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">print</span>
    <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #008000;">True</span>:
        line = proc.<span style="color: black;">stdout</span>.<span style="color: #dc143c;">readline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        wx.<span style="color: black;">Yield</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> line.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == <span style="color: #483d8b;">&quot;&quot;</span>:
            <span style="color: #ff7700;font-weight:bold;">pass</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #ff7700;font-weight:bold;">print</span> line.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> line: <span style="color: #ff7700;font-weight:bold;">break</span>
    proc.<span style="color: black;">wait</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>In this code, we use wx.Yield to send the ping results to our text control in real time. If we didn&#8217;t, then we wouldn&#8217;t receive any of the ping results until ping had finished running. Note that we also use an infinite loop to grab the results. Once the results stop coming, we break out of the loop. If you look at the tracert code, you&#8217;ll see that the only difference is in out <em>subprocess.Popen</em> command. This would be a good candidate for refactoring, but I&#8217;ll leave that as an exercise for the reader.</p>
<h2>Getting NIC Information with Python</h2>
<p>Microsoft has a whole set of Python scripts on their <a href="http://www.microsoft.com/technet/scriptcenter/scripts/python/pyindex.mspx?mfr=true">Technet </a>sub-site and I ended up using on them to get all kinds of good information on the Network Interface Cards (NIC) in our PCs. I won&#8217;t reproduce the code here since it&#8217;s long and we already have it above. However, it&#8217;s pretty easy to follow and I suspect that you could use WMI to get the same information if you know what you&#8217;re doing. The main part that we were interested in was the MAC and IP addresses. Let&#8217;s just extract that info from the long code and see how easy it is to get:</p>
<pre class="python">strComputer = <span style="color: #483d8b;">&quot;.&quot;</span>
objWMIService = win32com.<span style="color: black;">client</span>.<span style="color: black;">Dispatch</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;WbemScripting.SWbemLocator&quot;</span><span style="color: black;">&#41;</span>
objSWbemServices = objWMIService.<span style="color: black;">ConnectServer</span><span style="color: black;">&#40;</span>strComputer,<span style="color: #483d8b;">&quot;root<span style="color: #000099; font-weight: bold;">\c</span>imv2&quot;</span><span style="color: black;">&#41;</span>
colItems = objSWbemServices.<span style="color: black;">ExecQuery</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Select * from Win32_NetworkAdapterConfiguration&quot;</span><span style="color: black;">&#41;</span>
numOfNics = <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>colItems<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">for</span> objItem <span style="color: #ff7700;font-weight:bold;">in</span> colItems:
    z = objItem.<span style="color: black;">IPAddress</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> z <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
        a = <span style="color: #ff4500;">1</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
        <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> z:
             <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;IP Address: &quot;</span>, x
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;MAC Address: &quot;</span>, objItem.<span style="color: black;">MACAddress</span></pre>
<p>Pretty easy, huh? And look! You use what looks like SQL syntax to run the query. This is why I think you can probably use WMI (in fact, that may be what it&#8217;s doing in an obtuse manner). Anyway, that&#8217;s really all there is to it.</p>
<h2>Wrapping Up</h2>
<p>Now you know the secrets to get various bits of networking information from your PC and how to redirect subprocess&#8217;s PIPEs to a log file and a wxPython text control. How you choose to use this information is up to you.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.blog.pythonlibrary.org/2010/06/05/python-running-ping-traceroute-and-more/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>wxPython and Threads</title>
		<link>http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/</link>
		<comments>http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/#comments</comments>
		<pubDate>Sun, 23 May 2010 00:08:59 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[wxPython]]></category>
		<category><![CDATA[Threads]]></category>

		<guid isPermaLink="false">http://www.blog.pythonlibrary.org/?p=880</guid>
		<description><![CDATA[If you use GUIs in Python much, then you know that sometimes you need to execute some long running process every now and then. Of course, if you do that as you would with a command line program, then you&#8217;ll be in for a surprise. In most cases, you&#8217;ll end up blocking your GUI&#8217;s event [...]]]></description>
			<content:encoded><![CDATA[<p>If you use GUIs in Python much, then you know that sometimes you need to execute some long running process every now and then. Of course, if you do that as you would with a command line program, then you&#8217;ll be in for a surprise. In most cases, you&#8217;ll end up blocking your GUI&#8217;s event loop and the user will see your program freeze. What can you do to get around just mishaps? Start the task in another thread or process of course! In this article, we&#8217;ll look at how to do this with wxPython and Python&#8217;s threading module.<span id="more-880"></span></p>
<h2>wxPython&#8217;s Threadsafe Methods</h2>
<p>In the wxPython world, there are three related &#8220;threadsafe&#8221; methods. If you do not use one of these three when you go to update your user interface, then you may experience weird issues. Sometimes your GUI will work just fine. Other times, it will crash Python for no apparent reason. Thus the need for the threadsafe methods: wx.PostEvent, wx.CallAfter and wx.CallLater. According to Robin Dunn (creator of wxPython), wx.CallAfter uses wx.PostEvent to send an event to the application object. The application will have an event handler bound to that event and will react according to whatever the programmer has coded upon receipt of the event. It is my understanding that wx.CallLater calls wx.CallAfter with a specified time limit so that you can tell it how long to wait before sending the event.</p>
<p>Robin Dunn also pointed out that the Python Global Interpreter Lock (GIL) will prevent more than one thread to be executing Python bytecodes at the same time, which may limit how many CPU cores are utilized by your program. On the flip-side, he also said that &#8220;wxPython releases the GIL while making calls to wx APIs so other threads can run at that time&#8221;. In other words, your mileage may vary when using threads on multicore machines. I found this discussion to be interesting and confusing&#8230;</p>
<p>Anyway, what this means in regard to the three wx-methods is that wx.CallLater is the most abstract threadsafe method with wx.CallAfter next and wx.PostEvent being the most low-level. In the following examples, you will see how to use wx.CallAfter and wx.PostEvent to update your wxPython program. </p>
<h2>wxPython, Threading, wx.CallAfter and PubSub</h2>
<p>On the wxPython mailing list, you&#8217;ll see the experts telling others to use wx.CallAfter along with PubSub to communicate with their wxPython applications from another thread. I&#8217;ve probably even told people to do that. So in the following example, that&#8217;s exactly what we&#8217;re going to do:</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span>
<span style="color: #ff7700;font-weight:bold;">import</span> wx
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">threading</span> <span style="color: #ff7700;font-weight:bold;">import</span> Thread
<span style="color: #ff7700;font-weight:bold;">from</span> wx.<span style="color: black;">lib</span>.<span style="color: black;">pubsub</span> <span style="color: #ff7700;font-weight:bold;">import</span> Publisher
&nbsp;
<span style="color: #808080; font-style: italic;">########################################################################</span>
<span style="color: #ff7700;font-weight:bold;">class</span> TestThread<span style="color: black;">&#40;</span>Thread<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;Test Worker Thread Class.&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;Init Worker Thread Class.&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        Thread.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">start</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>    <span style="color: #808080; font-style: italic;"># start the thread</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> run<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;Run Worker Thread.&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        <span style="color: #808080; font-style: italic;"># This is the code executing in the new thread.</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">6</span><span style="color: black;">&#41;</span>:
            <span style="color: #dc143c;">time</span>.<span style="color: black;">sleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">10</span><span style="color: black;">&#41;</span>
            wx.<span style="color: black;">CallAfter</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">postTime</span>, i<span style="color: black;">&#41;</span>
        <span style="color: #dc143c;">time</span>.<span style="color: black;">sleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        wx.<span style="color: black;">CallAfter</span><span style="color: black;">&#40;</span>Publisher<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">sendMessage</span>, <span style="color: #483d8b;">&quot;update&quot;</span>, <span style="color: #483d8b;">&quot;Thread finished!&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> postTime<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, amt<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        Send time to GUI
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        amtOfTime = <span style="color: black;">&#40;</span>amt + <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">10</span>
        Publisher<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">sendMessage</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;update&quot;</span>, amtOfTime<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">########################################################################</span>
<span style="color: #ff7700;font-weight:bold;">class</span> MyForm<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>, <span style="color: #483d8b;">&quot;Tutorial&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># Add a panel so it looks the correct on all platforms</span>
        panel = wx.<span style="color: black;">Panel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, wx.<span style="color: black;">ID_ANY</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">displayLbl</span> = wx.<span style="color: black;">StaticText</span><span style="color: black;">&#40;</span>panel, label=<span style="color: #483d8b;">&quot;Amount of time since thread started goes here&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">btn</span> = btn = wx.<span style="color: black;">Button</span><span style="color: black;">&#40;</span>panel, label=<span style="color: #483d8b;">&quot;Start Thread&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
        btn.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onButton</span><span style="color: black;">&#41;</span>
&nbsp;
        sizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">displayLbl</span>, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>btn, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        panel.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span>sizer<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># create a pubsub receiver</span>
        Publisher<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">subscribe</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">updateDisplay</span>, <span style="color: #483d8b;">&quot;update&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onButton<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        Runs the thread
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        TestThread<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">displayLbl</span>.<span style="color: black;">SetLabel</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Thread started!&quot;</span><span style="color: black;">&#41;</span>
        btn = event.<span style="color: black;">GetEventObject</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        btn.<span style="color: black;">Disable</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> updateDisplay<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, msg<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        Receives data from thread and updates the display
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        t = msg.<span style="color: black;">data</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">isinstance</span><span style="color: black;">&#40;</span>t, <span style="color: #008000;">int</span><span style="color: black;">&#41;</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">displayLbl</span>.<span style="color: black;">SetLabel</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Time since thread started: %s seconds&quot;</span> <span style="color: #66cc66;">%</span> t<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">displayLbl</span>.<span style="color: black;">SetLabel</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;%s&quot;</span> <span style="color: #66cc66;">%</span> t<span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">btn</span>.<span style="color: black;">Enable</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
<span style="color: #808080; font-style: italic;"># Run the program</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app = wx.<span style="color: black;">PySimpleApp</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    frame = MyForm<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>We&#8217;ll be using Python&#8217;s <em>time</em> module to fake our long running process. However, feel free to put something better in its place. In a real life example, I use a thread to open Adobe Reader and send a PDF to a printer. That might not seem like anything special, but when I didn&#8217;t use a thread, the print button in my application would stay stuck down while the document was sent to the printer and my GUI just hung until that was done. Even a a second or two is noticeable to the user!</p>
<p>Anyway, let&#8217;s see how this works. In our thread class (reproduced below), we override the &#8220;run&#8221; method so it does what we want. This thread is started when we instantiate it because we have &#8220;self.start()&#8221; in its __init__ method. In the &#8220;run&#8221; method, we loop over a range of 6, sleeping for 10 seconds in between iterations and then update our user interface using wx.CallAfter and PubSub. When the loop finishes, we send a final message to our application to let the user know what happened.</p>
<pre class="python"><span style="color: #808080; font-style: italic;">########################################################################</span>
<span style="color: #ff7700;font-weight:bold;">class</span> TestThread<span style="color: black;">&#40;</span>Thread<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;Test Worker Thread Class.&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;Init Worker Thread Class.&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        Thread.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">start</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>    <span style="color: #808080; font-style: italic;"># start the thread</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> run<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;Run Worker Thread.&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        <span style="color: #808080; font-style: italic;"># This is the code executing in the new thread.</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">6</span><span style="color: black;">&#41;</span>:
            <span style="color: #dc143c;">time</span>.<span style="color: black;">sleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">10</span><span style="color: black;">&#41;</span>
            wx.<span style="color: black;">CallAfter</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">postTime</span>, i<span style="color: black;">&#41;</span>
        <span style="color: #dc143c;">time</span>.<span style="color: black;">sleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        wx.<span style="color: black;">CallAfter</span><span style="color: black;">&#40;</span>Publisher<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">sendMessage</span>, <span style="color: #483d8b;">&quot;update&quot;</span>, <span style="color: #483d8b;">&quot;Thread finished!&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> postTime<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, amt<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        Send time to GUI
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        amtOfTime = <span style="color: black;">&#40;</span>amt + <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">10</span>
        Publisher<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">sendMessage</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;update&quot;</span>, amtOfTime<span style="color: black;">&#41;</span></pre>
<p>You&#8217;ll notice that in our wxPython code, we start the thread using a button event handler. We also disable the button so we don&#8217;t accidentally start additional threads. That would be pretty confusing if we had a bunch of them going and the UI would randomly say that it was done when it wasn&#8217;t. That is a good exercise for the reader though. You could display the PID of the thread so you&#8217;d know which was which&#8230;and you might want to output this information to a scrolling text control so you can see the activity of the various threads.</p>
<p>The last piece of interest here is probably the PubSub receiver and its event handler:</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">def</span> updateDisplay<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, msg<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
    Receives data from thread and updates the display
    &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
    t = msg.<span style="color: black;">data</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">isinstance</span><span style="color: black;">&#40;</span>t, <span style="color: #008000;">int</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">displayLbl</span>.<span style="color: black;">SetLabel</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Time since thread started: %s seconds&quot;</span> <span style="color: #66cc66;">%</span> t<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">displayLbl</span>.<span style="color: black;">SetLabel</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;%s&quot;</span> <span style="color: #66cc66;">%</span> t<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">btn</span>.<span style="color: black;">Enable</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>See how we extract the message from the thread and use it to update our display? We also use the type of data we receive to tell us what to show the user. Pretty cool, huh? Now let&#8217;s go down a level and check out how to do it with wx.PostEvent instead.</p>
<h2>wx.PostEvent and Threads</h2>
<p>The following code is based on an example from the <a href="http://wiki.wxpython.org/LongRunningTasks">wxPython wiki</a>. It&#8217;s a little bit more complicated than the wx.CallAfter code we just looked at, but I&#8217;m confident that we can figure it out.</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span>
<span style="color: #ff7700;font-weight:bold;">import</span> wx
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">threading</span> <span style="color: #ff7700;font-weight:bold;">import</span> Thread
&nbsp;
<span style="color: #808080; font-style: italic;"># Define notification event for thread completion</span>
EVT_RESULT_ID = wx.<span style="color: black;">NewId</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> EVT_RESULT<span style="color: black;">&#40;</span>win, func<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;Define Result Event.&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
    win.<span style="color: black;">Connect</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">-1</span>, <span style="color: #ff4500;">-1</span>, EVT_RESULT_ID, func<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> ResultEvent<span style="color: black;">&#40;</span>wx.<span style="color: black;">PyEvent</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;Simple event to carry arbitrary result data.&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, data<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;Init Result Event.&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        wx.<span style="color: black;">PyEvent</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">SetEventType</span><span style="color: black;">&#40;</span>EVT_RESULT_ID<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">data</span> = data
&nbsp;
<span style="color: #808080; font-style: italic;">########################################################################</span>
<span style="color: #ff7700;font-weight:bold;">class</span> TestThread<span style="color: black;">&#40;</span>Thread<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;Test Worker Thread Class.&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, wxObject<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;Init Worker Thread Class.&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        Thread.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">wxObject</span> = wxObject
        <span style="color: #008000;">self</span>.<span style="color: black;">start</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>    <span style="color: #808080; font-style: italic;"># start the thread</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> run<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;Run Worker Thread.&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        <span style="color: #808080; font-style: italic;"># This is the code executing in the new thread.</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">6</span><span style="color: black;">&#41;</span>:
            <span style="color: #dc143c;">time</span>.<span style="color: black;">sleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">10</span><span style="color: black;">&#41;</span>
            amtOfTime = <span style="color: black;">&#40;</span>i + <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">10</span>
            wx.<span style="color: black;">PostEvent</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">wxObject</span>, ResultEvent<span style="color: black;">&#40;</span>amtOfTime<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #dc143c;">time</span>.<span style="color: black;">sleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        wx.<span style="color: black;">PostEvent</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">wxObject</span>, ResultEvent<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Thread finished!&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">########################################################################</span>
<span style="color: #ff7700;font-weight:bold;">class</span> MyForm<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>, <span style="color: #483d8b;">&quot;Tutorial&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># Add a panel so it looks the correct on all platforms</span>
        panel = wx.<span style="color: black;">Panel</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, wx.<span style="color: black;">ID_ANY</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">displayLbl</span> = wx.<span style="color: black;">StaticText</span><span style="color: black;">&#40;</span>panel, label=<span style="color: #483d8b;">&quot;Amount of time since thread started goes here&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">btn</span> = btn = wx.<span style="color: black;">Button</span><span style="color: black;">&#40;</span>panel, label=<span style="color: #483d8b;">&quot;Start Thread&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
        btn.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onButton</span><span style="color: black;">&#41;</span>
&nbsp;
        sizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">displayLbl</span>, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>btn, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        panel.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span>sizer<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># Set up event handler for any worker thread results</span>
        EVT_RESULT<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">self</span>.<span style="color: black;">updateDisplay</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onButton<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        Runs the thread
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        TestThread<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">displayLbl</span>.<span style="color: black;">SetLabel</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Thread started!&quot;</span><span style="color: black;">&#41;</span>
        btn = event.<span style="color: black;">GetEventObject</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        btn.<span style="color: black;">Disable</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> updateDisplay<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, msg<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        Receives data from thread and updates the display
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        t = msg.<span style="color: black;">data</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">isinstance</span><span style="color: black;">&#40;</span>t, <span style="color: #008000;">int</span><span style="color: black;">&#41;</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">displayLbl</span>.<span style="color: black;">SetLabel</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Time since thread started: %s seconds&quot;</span> <span style="color: #66cc66;">%</span> t<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">displayLbl</span>.<span style="color: black;">SetLabel</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;%s&quot;</span> <span style="color: #66cc66;">%</span> t<span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">btn</span>.<span style="color: black;">Enable</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
<span style="color: #808080; font-style: italic;"># Run the program</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app = wx.<span style="color: black;">PySimpleApp</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    frame = MyForm<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>Let&#8217;s break this down a bit. For me, the most confusing stuff is the first three pieces:</p>
<pre class="python"><span style="color: #808080; font-style: italic;"># Define notification event for thread completion</span>
EVT_RESULT_ID = wx.<span style="color: black;">NewId</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> EVT_RESULT<span style="color: black;">&#40;</span>win, func<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;Define Result Event.&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
    win.<span style="color: black;">Connect</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">-1</span>, <span style="color: #ff4500;">-1</span>, EVT_RESULT_ID, func<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> ResultEvent<span style="color: black;">&#40;</span>wx.<span style="color: black;">PyEvent</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;Simple event to carry arbitrary result data.&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, data<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;Init Result Event.&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        wx.<span style="color: black;">PyEvent</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">SetEventType</span><span style="color: black;">&#40;</span>EVT_RESULT_ID<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">data</span> = data</pre>
<p>The EVT_RESULT_ID is the key here. It links the thread to the wx.PyEvent and that weird &#8220;EVT_RESULT&#8221; function. In the wxPython code, we bind an event handler to the EVT_RESULT function. This allows us to us wx.PostEvent in the thread to send an event to our custom event class, ResultEvent. What does this do? It sends the data on to the wxPython program by emitting that custom EVT_RESULT that we bound to. I hope that all makes sense.</p>
<p>Once you&#8217;ve got that figured out in your head, read on. Are you ready? Good! You&#8217;ll notice that our <em>TestThread</em> class is pretty much the same as before except that we&#8217;re using wx.PostEvent to send our messages to the GUI instead of PubSub. The API in our GUI&#8217;s display updater is unchanged. We still just use the message&#8217;s data property to extract the data we want. That&#8217;s all there is to it!</p>
<h2>Wrapping Up</h2>
<p>Hopefully you now know how to use basic threading techniques in your wxPython programs. There are several other threading methods too which we didn&#8217;t have a chance to cover here, such as using wx.Yield or Queues. Fortunately, the wxPython wiki covers these topics pretty well, so be sure to check out the links below if you&#8217;re interested in those methods.</p>
<h2>Further Reading</h2>
<ul>
<li><a href="http://wiki.wxpython.org/LongRunningTasks">LongRunningTasks </a>wiki page</li>
<li><a href="http://wiki.wxpython.org/Non-Blocking%20Gui">Non-Blocking GUI</a> wiki page</li>
<li><a href="http://wiki.wxpython.org/WorkingWithThreads">WorkingWithThreads </a>wiki page</li>
</ul>
<h2>Downloads</h2>
<ul>
<li><a href='http://www.blog.pythonlibrary.org/wp-content/uploads/2010/05/wxthreads.zip'>wxthreads.zip</a></li>
<li><a href='http://www.blog.pythonlibrary.org/wp-content/uploads/2010/05/wxthreads.tar'>wxthreads.tar</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Manipulating PDFs with Python and pyPdf</title>
		<link>http://www.blog.pythonlibrary.org/2010/05/15/manipulating-pdfs-with-python-and-pypdf/</link>
		<comments>http://www.blog.pythonlibrary.org/2010/05/15/manipulating-pdfs-with-python-and-pypdf/#comments</comments>
		<pubDate>Sat, 15 May 2010 19:50:11 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[wxPython]]></category>
		<category><![CDATA[Python PDF Series]]></category>

		<guid isPermaLink="false">http://www.blog.pythonlibrary.org/?p=868</guid>
		<description><![CDATA[There&#8217;s a handy 3rd party module called pyPdf out there that you can use to merge PDFs documents together, rotate pages, split and crop pages, and decrypt/encrypt PDF documents. In this article, we&#8217;ll take a look at a few of these functions and then create a simple GUI with wxPython that will allow us to [...]]]></description>
			<content:encoded><![CDATA[<p>There&#8217;s a handy 3rd party module called <a href="http://pybrary.net/pyPdf/">pyPdf</a> out there that you can use to merge PDFs documents together, rotate pages, split and crop pages, and decrypt/encrypt PDF documents. In this article, we&#8217;ll take a look at a few of these functions and then create a simple GUI with <a href="http://www.wxpython.org">wxPython</a> that will allow us to merge a couple of PDFs.<span id="more-868"></span></p>
<h2>A pyPdf Tour</h2>
<p>To get the most out of pyPdf, you need to learn its two major functions: PdfFileReader and PdfFileWriter. They are the ones that I use the most. Let&#8217;s take a look at what they can do:</p>
<pre class="python"><span style="color: #808080; font-style: italic;"># Merge two PDFs</span>
<span style="color: #ff7700;font-weight:bold;">from</span> pyPdf <span style="color: #ff7700;font-weight:bold;">import</span> PdfFileReader, PdfFileWriter
&nbsp;
output = PdfFileWriter<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
pdfOne = PdfFileReader<span style="color: black;">&#40;</span><span style="color: #008000;">file</span><span style="color: black;">&#40;</span> <span style="color: #483d8b;">&quot;some<span style="color: #000099; font-weight: bold;">\p</span>ath<span style="color: #000099; font-weight: bold;">\t</span>o<span style="color: #000099; font-weight: bold;">\a</span><span style="color: #000099; font-weight: bold;">\P</span>Df&quot;</span>, <span style="color: #483d8b;">&quot;rb&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
pdfTwo = PdfFileReader<span style="color: black;">&#40;</span><span style="color: #008000;">file</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;some<span style="color: #000099; font-weight: bold;">\o</span>ther<span style="color: #000099; font-weight: bold;">\p</span>ath<span style="color: #000099; font-weight: bold;">\t</span>o<span style="color: #000099; font-weight: bold;">\a</span><span style="color: #000099; font-weight: bold;">\P</span>Df&quot;</span>, <span style="color: #483d8b;">&quot;rb&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
output.<span style="color: black;">addPage</span><span style="color: black;">&#40;</span>pdfOne.<span style="color: black;">getPage</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
output.<span style="color: black;">addPage</span><span style="color: black;">&#40;</span>pdfTwo.<span style="color: black;">getPage</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
outputStream = <span style="color: #008000;">file</span><span style="color: black;">&#40;</span>r<span style="color: #483d8b;">&quot;output.pdf&quot;</span>, <span style="color: #483d8b;">&quot;wb&quot;</span><span style="color: black;">&#41;</span>
output.<span style="color: black;">write</span><span style="color: black;">&#40;</span>outputStream<span style="color: black;">&#41;</span>
outputStream.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>The code above will open two PDFs, take the first page from each and create a third PDF by joining those two pages. Note that the pages are zero-based, so zero is page one, one is page two, etc. I use this sort of script to extract one or more pages from a PDF or to join a series of PDFs together. For example, sometimes my users will receive a bunch of scanned documents where each page of the document ends up in a separate PDF. They need all the single pages joined into one PDF and pyPdf allows me to do this very simply.</p>
<p>There aren&#8217;t many applications for the rotating functions that pyPdf gives me in my day-to-day experience, but maybe you have lots of users that scan documents in landscape rather than portrait and you end up needing to do a lot of turning. Fortunately, this is pretty painless:</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">from</span> pyPdf <span style="color: #ff7700;font-weight:bold;">import</span> PdfFileWriter, PdfFileReader
&nbsp;
output = PdfFileWriter<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
input1 = PdfFileReader<span style="color: black;">&#40;</span><span style="color: #008000;">file</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;document1.pdf&quot;</span>, <span style="color: #483d8b;">&quot;rb&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
output.<span style="color: black;">addPage</span><span style="color: black;">&#40;</span>input1.<span style="color: black;">getPage</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>.<span style="color: black;">rotateClockwise</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">90</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: #808080; font-style: italic;"># output.addPage(input1.getPage(2).rotateCounterClockwise(90))</span>
&nbsp;
outputStream = <span style="color: #008000;">file</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;output.pdf&quot;</span>, <span style="color: #483d8b;">&quot;wb&quot;</span><span style="color: black;">&#41;</span>
output.<span style="color: black;">write</span><span style="color: black;">&#40;</span>outputStream<span style="color: black;">&#41;</span>
outputStream.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>The code above is just taken from the pyPdf documentation and shortened for this example. As you can see, the method to call is <em>rotateClockwise</em> or <em>rotateCounterClockwise</em>. Make sure you pass the method the number of degrees to turn the page as well.</p>
<p>Now let&#8217;s see what information we can pull from the PDF about itself:</p>
<pre class="python"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">from</span> pyPdf <span style="color: #ff7700;font-weight:bold;">import</span> PdfFileReader
<span style="color: #66cc66;">&gt;&gt;&gt;</span> p = r<span style="color: #483d8b;">'E:<span style="color: #000099; font-weight: bold;">\M</span>y Documents<span style="color: #000099; font-weight: bold;">\M</span>y Dropbox<span style="color: #000099; font-weight: bold;">\e</span>books<span style="color: #000099; font-weight: bold;">\h</span>elloWorld book.pdf'</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> pdf = PdfFileReader<span style="color: black;">&#40;</span><span style="color: #008000;">file</span><span style="color: black;">&#40;</span>p, <span style="color: #483d8b;">'rb'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> pdf.<span style="color: black;">documentInfo</span>
<span style="color: black;">&#123;</span><span style="color: #483d8b;">'/CreationDate'</span>: u<span style="color: #483d8b;">'D:20090323080712Z'</span>, <span style="color: #483d8b;">'/Author'</span>: u<span style="color: #483d8b;">'Warren Sande'</span>, <span style="color: #483d8b;">'/Producer'</span>: u<span style="color: #483d8b;">'Acrobat Distiller 8.0.0 (Windows)'</span>, <span style="color: #483d8b;">'/Creator'</span>: u<span style="color: #483d8b;">'FrameMaker 8.0'</span>, <span style="color: #483d8b;">'/ModDate'</span>: u<span style="color: #483d8b;">&quot;D:20090401124817-04'00'&quot;</span>, <span style="color: #483d8b;">'/Title'</span>: u<span style="color: #483d8b;">'Hello World!'</span><span style="color: black;">&#125;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> pdf.<span style="color: black;">getNumPages</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff4500;">432</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> info = pdf.<span style="color: black;">getDocumentInfo</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> info.<span style="color: black;">author</span>
u<span style="color: #483d8b;">'Warren Sande'</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> info.<span style="color: black;">creator</span>
u<span style="color: #483d8b;">'FrameMaker 8.0'</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> info.<span style="color: black;">producer</span>
u<span style="color: #483d8b;">'Acrobat Distiller 8.0.0 (Windows)'</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> info.<span style="color: black;">title</span>
u<span style="color: #483d8b;">'Hello World!'</span></pre>
<p>As you can see, we can gather quite a bit of useful data using pyPdf. Now let&#8217;s create a simple GUI to make merging two PDFs easier!</p>
<h2>Creating a wxPython PDF Merger Application</h2>
<p><a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/05/pdf_joiner.png"><img src="http://www.blog.pythonlibrary.org/wp-content/uploads/2010/05/pdf_joiner.png" alt="PDF Joiner" title="PDF Joiner" width="416" height="200" class="aligncenter size-full wp-image-875" /></a></p>
<p>I came up with this script yesterday. It uses Tim Golden&#8217;s <a href="http://timgolden.me.uk/python/winshell.html">winshell </a>module to give me easy access to the user&#8217;s desktop on Windows. If you&#8217;re on Linux or Mac, then you&#8217;ll want to change this part of the code for your platform. I wanted to use wxPython&#8217;s StandardPaths module, but it didn&#8217;t have a function for getting the desktop that I could see. Anyway, enough talk. Let&#8217;s look at some code!</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>
<span style="color: #ff7700;font-weight:bold;">import</span> pyPdf
<span style="color: #ff7700;font-weight:bold;">import</span> winshell
<span style="color: #ff7700;font-weight:bold;">import</span> wx
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> MyFileDropTarget<span style="color: black;">&#40;</span>wx.<span style="color: black;">FileDropTarget</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, window<span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">FileDropTarget</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">window</span> = window
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> OnDropFiles<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, x, y, filenames<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">window</span>.<span style="color: black;">SetInsertionPointEnd</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">for</span> <span style="color: #008000;">file</span> <span style="color: #ff7700;font-weight:bold;">in</span> filenames:
            <span style="color: #008000;">self</span>.<span style="color: black;">window</span>.<span style="color: black;">WriteText</span><span style="color: black;">&#40;</span><span style="color: #008000;">file</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">########################################################################</span>
<span style="color: #ff7700;font-weight:bold;">class</span> JoinerPanel<span style="color: black;">&#40;</span>wx.<span style="color: black;">Panel</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, parent<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;Constructor&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        wx.<span style="color: black;">Panel</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, parent=parent<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">currentPath</span> = winshell.<span style="color: black;">desktop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
        lblSize = <span style="color: black;">&#40;</span><span style="color: #ff4500;">70</span>,<span style="color: #ff4500;">-1</span><span style="color: black;">&#41;</span>
        pdfLblOne = wx.<span style="color: black;">StaticText</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, label=<span style="color: #483d8b;">&quot;PDF One:&quot;</span>, size=lblSize<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">pdfOne</span> = wx.<span style="color: black;">TextCtrl</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
        dt = MyFileDropTarget<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">pdfOne</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">pdfOne</span>.<span style="color: black;">SetDropTarget</span><span style="color: black;">&#40;</span>dt<span style="color: black;">&#41;</span>
        pdfOneBtn = wx.<span style="color: black;">Button</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, label=<span style="color: #483d8b;">&quot;Browse&quot;</span>, name=<span style="color: #483d8b;">&quot;pdfOneBtn&quot;</span><span style="color: black;">&#41;</span>
        pdfOneBtn.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onBrowse</span><span style="color: black;">&#41;</span>
&nbsp;
        pdfLblTwo = wx.<span style="color: black;">StaticText</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, label=<span style="color: #483d8b;">&quot;PDF Two:&quot;</span>, size=lblSize<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">pdfTwo</span> = wx.<span style="color: black;">TextCtrl</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
        dt = MyFileDropTarget<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">pdfTwo</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">pdfTwo</span>.<span style="color: black;">SetDropTarget</span><span style="color: black;">&#40;</span>dt<span style="color: black;">&#41;</span>
        pdfTwoBtn = wx.<span style="color: black;">Button</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, label=<span style="color: #483d8b;">&quot;Browse&quot;</span>, name=<span style="color: #483d8b;">&quot;pdfTwoBtn&quot;</span><span style="color: black;">&#41;</span>
        pdfTwoBtn.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onBrowse</span><span style="color: black;">&#41;</span>
&nbsp;
        outputLbl = wx.<span style="color: black;">StaticText</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, label=<span style="color: #483d8b;">&quot;Output name:&quot;</span>, size=lblSize<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">outputPdf</span> = wx.<span style="color: black;">TextCtrl</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
        widgets = <span style="color: black;">&#91;</span><span style="color: black;">&#40;</span>pdfLblOne, <span style="color: #008000;">self</span>.<span style="color: black;">pdfOne</span>, pdfOneBtn<span style="color: black;">&#41;</span>,
                   <span style="color: black;">&#40;</span>pdfLblTwo, <span style="color: #008000;">self</span>.<span style="color: black;">pdfTwo</span>, pdfTwoBtn<span style="color: black;">&#41;</span>,
                   <span style="color: black;">&#40;</span>outputLbl, <span style="color: #008000;">self</span>.<span style="color: black;">outputPdf</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span>
&nbsp;
        joinBtn = wx.<span style="color: black;">Button</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, label=<span style="color: #483d8b;">&quot;Join PDFs&quot;</span><span style="color: black;">&#41;</span>
        joinBtn.<span style="color: black;">Bind</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">EVT_BUTTON</span>, <span style="color: #008000;">self</span>.<span style="color: black;">onJoinPdfs</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">mainSizer</span> = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">VERTICAL</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> widget <span style="color: #ff7700;font-weight:bold;">in</span> widgets:
            <span style="color: #008000;">self</span>.<span style="color: black;">buildRows</span><span style="color: black;">&#40;</span>widget<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">mainSizer</span>.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>joinBtn, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">SetSizer</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">mainSizer</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> buildRows<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, widgets<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        sizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">HORIZONTAL</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> widget <span style="color: #ff7700;font-weight:bold;">in</span> widgets:
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">isinstance</span><span style="color: black;">&#40;</span>widget, wx.<span style="color: black;">StaticText</span><span style="color: black;">&#41;</span>:
                sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>widget, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">CENTER</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">elif</span> <span style="color: #008000;">isinstance</span><span style="color: black;">&#40;</span>widget, wx.<span style="color: black;">TextCtrl</span><span style="color: black;">&#41;</span>:
                sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>widget, <span style="color: #ff4500;">1</span>, wx.<span style="color: black;">ALL</span>|wx.<span style="color: black;">EXPAND</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">else</span>:
                sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>widget, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">ALL</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">mainSizer</span>.<span style="color: black;">Add</span><span style="color: black;">&#40;</span>sizer, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">EXPAND</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onBrowse<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        Browse for PDFs
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        widget = event.<span style="color: black;">GetEventObject</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        name = widget.<span style="color: black;">GetName</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        wildcard = <span style="color: #483d8b;">&quot;PDF (*.pdf)|*.pdf&quot;</span>
        dlg = wx.<span style="color: black;">FileDialog</span><span style="color: black;">&#40;</span>
            <span style="color: #008000;">self</span>, message=<span style="color: #483d8b;">&quot;Choose a file&quot;</span>,
            defaultDir=<span style="color: #008000;">self</span>.<span style="color: black;">currentPath</span>,
            defaultFile=<span style="color: #483d8b;">&quot;&quot;</span>,
            wildcard=wildcard,
            style=wx.<span style="color: black;">OPEN</span> | wx.<span style="color: black;">CHANGE_DIR</span>
            <span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> dlg.<span style="color: black;">ShowModal</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == wx.<span style="color: black;">ID_OK</span>:
            path = dlg.<span style="color: black;">GetPath</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> name == <span style="color: #483d8b;">&quot;pdfOneBtn&quot;</span>:
                <span style="color: #008000;">self</span>.<span style="color: black;">pdfOne</span>.<span style="color: black;">SetValue</span><span style="color: black;">&#40;</span>path<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">else</span>:
                <span style="color: #008000;">self</span>.<span style="color: black;">pdfTwo</span>.<span style="color: black;">SetValue</span><span style="color: black;">&#40;</span>path<span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">currentPath</span> = <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">dirname</span><span style="color: black;">&#40;</span>path<span style="color: black;">&#41;</span>
        dlg.<span style="color: black;">Destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> onJoinPdfs<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
        Join the two PDFs together and save the result to the desktop
        &quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
        pdfOne = <span style="color: #008000;">self</span>.<span style="color: black;">pdfOne</span>.<span style="color: black;">GetValue</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        pdfTwo = <span style="color: #008000;">self</span>.<span style="color: black;">pdfTwo</span>.<span style="color: black;">GetValue</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">exists</span><span style="color: black;">&#40;</span>pdfOne<span style="color: black;">&#41;</span>:
            msg = <span style="color: #483d8b;">&quot;The PDF at %s does not exist!&quot;</span> <span style="color: #66cc66;">%</span> pdfOne
            dlg = wx.<span style="color: black;">MessageDialog</span><span style="color: black;">&#40;</span><span style="color: #008000;">None</span>, msg, <span style="color: #483d8b;">'Error'</span>, wx.<span style="color: black;">OK</span>|wx.<span style="color: black;">ICON_EXCLAMATION</span><span style="color: black;">&#41;</span>
            dlg.<span style="color: black;">ShowModal</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            dlg.<span style="color: black;">Destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">exists</span><span style="color: black;">&#40;</span>pdfTwo<span style="color: black;">&#41;</span>:
            msg = <span style="color: #483d8b;">&quot;The PDF at %s does not exist!&quot;</span> <span style="color: #66cc66;">%</span> pdfTwo
            dlg = wx.<span style="color: black;">MessageDialog</span><span style="color: black;">&#40;</span><span style="color: #008000;">None</span>, msg, <span style="color: #483d8b;">'Error'</span>, wx.<span style="color: black;">OK</span>|wx.<span style="color: black;">ICON_EXCLAMATION</span><span style="color: black;">&#41;</span>
            dlg.<span style="color: black;">ShowModal</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            dlg.<span style="color: black;">Destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span>
&nbsp;
        outputPath = <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span>winshell.<span style="color: black;">desktop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, <span style="color: #008000;">self</span>.<span style="color: black;">outputPdf</span>.<span style="color: black;">GetValue</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot;.pdf&quot;</span>
        output = pyPdf.<span style="color: black;">PdfFileWriter</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        pdfOne = pyPdf.<span style="color: black;">PdfFileReader</span><span style="color: black;">&#40;</span><span style="color: #008000;">file</span><span style="color: black;">&#40;</span>pdfOne, <span style="color: #483d8b;">&quot;rb&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> page <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span>pdfOne.<span style="color: black;">getNumPages</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>:
            output.<span style="color: black;">addPage</span><span style="color: black;">&#40;</span>pdfOne.<span style="color: black;">getPage</span><span style="color: black;">&#40;</span>page<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        pdfTwo = pyPdf.<span style="color: black;">PdfFileReader</span><span style="color: black;">&#40;</span><span style="color: #008000;">file</span><span style="color: black;">&#40;</span>pdfTwo, <span style="color: #483d8b;">&quot;rb&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> page <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span>pdfTwo.<span style="color: black;">getNumPages</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>:
            output.<span style="color: black;">addPage</span><span style="color: black;">&#40;</span>pdfTwo.<span style="color: black;">getPage</span><span style="color: black;">&#40;</span>page<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
        outputStream = <span style="color: #008000;">file</span><span style="color: black;">&#40;</span>outputPath, <span style="color: #483d8b;">&quot;wb&quot;</span><span style="color: black;">&#41;</span>
        output.<span style="color: black;">write</span><span style="color: black;">&#40;</span>outputStream<span style="color: black;">&#41;</span>
        outputStream.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        msg = <span style="color: #483d8b;">&quot;PDF was save to &quot;</span> + outputPath
        dlg = wx.<span style="color: black;">MessageDialog</span><span style="color: black;">&#40;</span><span style="color: #008000;">None</span>, msg, <span style="color: #483d8b;">'PDF Created'</span>, wx.<span style="color: black;">OK</span>|wx.<span style="color: black;">ICON_INFORMATION</span><span style="color: black;">&#41;</span>
        dlg.<span style="color: black;">ShowModal</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        dlg.<span style="color: black;">Destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">pdfOne</span>.<span style="color: black;">SetValue</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">pdfTwo</span>.<span style="color: black;">SetValue</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">outputPdf</span>.<span style="color: black;">SetValue</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">########################################################################</span>
<span style="color: #ff7700;font-weight:bold;">class</span> JoinerFrame<span style="color: black;">&#40;</span>wx.<span style="color: black;">Frame</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        wx.<span style="color: black;">Frame</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">None</span>, wx.<span style="color: black;">ID_ANY</span>,
                          <span style="color: #483d8b;">&quot;PDF Joiner&quot;</span>, size=<span style="color: black;">&#40;</span><span style="color: #ff4500;">550</span>, <span style="color: #ff4500;">200</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        panel = JoinerPanel<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#----------------------------------------------------------------------</span>
<span style="color: #808080; font-style: italic;"># Run the program</span>
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    app = wx.<span style="color: black;">App</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
    frame = JoinerFrame<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    frame.<span style="color: black;">Show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>You&#8217;ll notice that the frame and panel have dopey names. Feel free to change them. This is Python after all! The <em>MyFileDropTarget</em> class is used to enable drag-and-drop functionality on the first two text controls. If the user wants, they may drag a PDF onto one of those text controls and the path will magically get inserted. Otherwise, they can use the Browse button(s) to find the PDF(s) of their choice. Once they have their PDFs chosen, they need to enter the name of the output PDF, which goes in the third text control. You don&#8217;t even need to append the &#8220;.pdf&#8221; extension since this application will do it for you. </p>
<p>The last step is to press the &#8220;Join PDFs&#8221; button. This will add the second PDF to the end of the first, then display a dialog if it was created successfully. For this to function correctly, we need to loop over all the pages of each PDF and add them to the output in order. </p>
<p>It would be fun to enhance this application with some kind of drag-and-drop interface where the user could see the PDF pages and rearrange them by dragging them around. Or just being able to specify a few pages from each PDF to add rather than joining them in their entirety. I&#8217;ll leave those as exercises for the reader though.</p>
<p>I hope you found this article interesting and that it will spark your creative juices. If you write something cool with these ideas, be sure to post a comment so I can see it! </p>
]]></content:encoded>
			<wfw:commentRss>http://www.blog.pythonlibrary.org/2010/05/15/manipulating-pdfs-with-python-and-pypdf/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 7.690 seconds -->
