<?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>程式設計 遇上 小提琴 &#187; wxPython</title>
	<atom:link href="http://blog.ez2learn.com/tag/wxpython/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.ez2learn.com</link>
	<description>Victor&#039;s個人部落格，關於程式設計與小提琴</description>
	<lastBuildDate>Thu, 26 Aug 2010 10:49:41 +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自製Control : 用Matplotlib畫圖表的FigurePanel</title>
		<link>http://blog.ez2learn.com/2009/07/22/wxpython-custom-control-figure-panel/</link>
		<comments>http://blog.ez2learn.com/2009/07/22/wxpython-custom-control-figure-panel/#comments</comments>
		<pubDate>Wed, 22 Jul 2009 13:39:49 +0000</pubDate>
		<dc:creator>victor</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Custon control]]></category>
		<category><![CDATA[自製控制項]]></category>
		<category><![CDATA[Matplotlib]]></category>
		<category><![CDATA[wxPython]]></category>

		<guid isPermaLink="false">http://blog.ez2learn.com/?p=691</guid>
		<description><![CDATA[最近可能會接到一個需要GUI上畫不少圖表的案子，於是就來研究了一下wxPython + matplotlib，前陣子買了wxPython in action，雖然一本1500元大洋讓我心有點淌血，不過這本書真的寫得很棒，讓我對wxPython有更深入的瞭解，如果案子接下來買n本都可以，我個人認為買書來讀是一種投資，所以基本上看上眼的書買起來也不會手軟，接著因為除了畫圖形，也需要用到不少GUI，我把wxPython官方的demo抓下來，裡面每個範例都跑了一次，對於wxPython能做到什麼地步有了更深入的瞭解，越來越覺得wxPython真是酷斃了，很好玩的GUI framework 在這之後，雖然案子還在歸劃的初期，不過我不是很喜歡空等而沒有程式可以寫的感覺，其實在接洽的這段期間就能先完成一些將會用到的東西，像是widget之類的，或寫寫原形來驗證確實可行之類的都很好，所以我就寫了一個用Matplotlib畫圖表的Control : FigurePanel，因為往後在寫GUI都會用到，如果每次都要特地寫來處理這些我會發瘋，當然最好的方法就是包成Control，如此一來所有圖表都可以直接使用，加上可以有統一的行為，例如另存新檔、列印等等，相當方便 什麼是Matplotlib? Matplotlib是一套強大的Python畫圖表用的函式庫，如果不知道他到底可以畫到什麼地步，就可以看他們官網的畫廊，相信看完後就知道它有多強大，幾乎你想得到的圖、想不到的圖，沒看過的圖，他都可以畫，當然，如果裡面沒有你要的圖，或著你要自創圖，當然也可以自己擴增，有了這套函式庫，原本我可能得先花個一個星期還多少時間來建構一套畫圖表的基礎，如今這些時間完全省了下來，這就是使用Open source的好處，沒有這些東西真的不知道要寫到民國幾年 切入正題，我們來看一下FigurePanel的原始碼 import wx from wx import xrc import matplotlib matplotlib.use&#40;'WXAgg'&#41; from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg from matplotlib.backends.backend_wx import NavigationToolbar2Wx from matplotlib.figure import Figure &#160; __all__ = &#91;&#34;HAVE_TOOL_BAR&#34;, &#34;FigurePanel&#34;, &#34;FigurePanelXmlHandler&#34;&#93; &#160; # this flag indicate that there is toolbar in figure panel HAVE_TOOL_BAR = 1 [...]]]></description>
			<content:encoded><![CDATA[<p>最近可能會接到一個需要GUI上畫不少圖表的案子，於是就來研究了一下wxPython + matplotlib，前陣子買了wxPython in action，雖然一本1500元大洋讓我心有點淌血，不過這本書真的寫得很棒，讓我對wxPython有更深入的瞭解，如果案子接下來買n本都可以，我個人認為買書來讀是一種投資，所以基本上看上眼的書買起來也不會手軟，接著因為除了畫圖形，也需要用到不少GUI，我把wxPython官方的demo抓下來，裡面每個範例都跑了一次，對於wxPython能做到什麼地步有了更深入的瞭解，越來越覺得wxPython真是酷斃了，很好玩的GUI framework</p>
<p>在這之後，雖然案子還在歸劃的初期，不過我不是很喜歡空等而沒有程式可以寫的感覺，其實在接洽的這段期間就能先完成一些將會用到的東西，像是widget之類的，或寫寫原形來驗證確實可行之類的都很好，所以我就寫了一個用Matplotlib畫圖表的Control : FigurePanel，因為往後在寫GUI都會用到，如果每次都要特地寫來處理這些我會發瘋，當然最好的方法就是包成Control，如此一來所有圖表都可以直接使用，加上可以有統一的行為，例如另存新檔、列印等等，相當方便</p>
<p>什麼是<a href="http://matplotlib.sourceforge.ne">Matplotlib</a>? Matplotlib是一套強大的Python畫圖表用的函式庫，如果不知道他到底可以畫到什麼地步，就可以看他們官網的<a href="http://matplotlib.sourceforge.net/gallery.html">畫廊</a>，相信看完後就知道它有多強大，幾乎你想得到的圖、想不到的圖，沒看過的圖，他都可以畫，當然，如果裡面沒有你要的圖，或著你要自創圖，當然也可以自己擴增，有了這套函式庫，原本我可能得先花個一個星期還多少時間來建構一套畫圖表的基礎，如今這些時間完全省了下來，這就是使用Open source的好處，沒有這些東西真的不知道要寫到民國幾年</p>
<p>切入正題，我們來看一下FigurePanel的原始碼</p>
<p><span id="more-691"></span></p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> wx
<span style="color: #ff7700;font-weight:bold;">from</span> wx <span style="color: #ff7700;font-weight:bold;">import</span> xrc
<span style="color: #ff7700;font-weight:bold;">import</span> matplotlib
matplotlib.<span style="color: black;">use</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'WXAgg'</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">from</span> matplotlib.<span style="color: black;">backends</span>.<span style="color: black;">backend_wxagg</span> <span style="color: #ff7700;font-weight:bold;">import</span> FigureCanvasWxAgg
<span style="color: #ff7700;font-weight:bold;">from</span> matplotlib.<span style="color: black;">backends</span>.<span style="color: black;">backend_wx</span> <span style="color: #ff7700;font-weight:bold;">import</span> NavigationToolbar2Wx
<span style="color: #ff7700;font-weight:bold;">from</span> matplotlib.<span style="color: black;">figure</span> <span style="color: #ff7700;font-weight:bold;">import</span> Figure
&nbsp;
__all__ = <span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;HAVE_TOOL_BAR&quot;</span>, <span style="color: #483d8b;">&quot;FigurePanel&quot;</span>, <span style="color: #483d8b;">&quot;FigurePanelXmlHandler&quot;</span><span style="color: black;">&#93;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># this flag indicate that there is toolbar in figure panel</span>
HAVE_TOOL_BAR = <span style="color: #ff4500;">1</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> FigurePanel<span style="color: black;">&#40;</span>wx.<span style="color: black;">PyPanel</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>, figSize=<span style="color: #008000;">None</span>, figDpi=<span style="color: #008000;">None</span>, <span style="color: #66cc66;">*</span>args, <span style="color: #66cc66;">**</span>kwargs<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>, <span style="color: #66cc66;">*</span>args, <span style="color: #66cc66;">**</span>kwargs<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">figSize</span> = figSize
        <span style="color: #008000;">self</span>.<span style="color: black;">figDpi</span> = figDpi
        <span style="color: #008000;">self</span>.<span style="color: black;">SetBackgroundStyle</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">BG_STYLE_CUSTOM</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">createFigure</span><span style="color: black;">&#40;</span>figSize, figDpi<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> createFigure<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, size, dpi<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Create figure canvas
&nbsp;
        &quot;&quot;&quot;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">fig</span> = Figure<span style="color: black;">&#40;</span>size, dpi<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">canvas</span> = FigureCanvasWxAgg<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, wx.<span style="color: black;">ID_ANY</span>, <span style="color: #008000;">self</span>.<span style="color: black;">fig</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">toolbar</span> = <span style="color: #008000;">None</span>
        <span style="color: #808080; font-style: italic;"># Now put all into 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>
        <span style="color: #808080; font-style: italic;"># This way of adding to sizer allows resizing</span>
        sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">canvas</span>, <span style="color: #ff4500;">1</span>, wx.<span style="color: black;">LEFT</span>|wx.<span style="color: black;">TOP</span>|wx.<span style="color: black;">GROW</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># add  tool bar</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">GetWindowStyle</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">&amp;</span>amp<span style="color: #66cc66;">;</span> HAVE_TOOL_BAR:
            <span style="color: #008000;">self</span>.<span style="color: black;">toolbar</span> = <span style="color: #008000;">self</span>.<span style="color: black;">createToolbar</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #808080; font-style: italic;"># On Windows, default frame size behaviour is incorrect</span>
            <span style="color: #808080; font-style: italic;"># you don't need this under Linux</span>
            tw, th = <span style="color: #008000;">self</span>.<span style="color: black;">toolbar</span>.<span style="color: black;">GetSizeTuple</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            fw, fh = <span style="color: #008000;">self</span>.<span style="color: black;">canvas</span>.<span style="color: black;">GetSizeTuple</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">toolbar</span>.<span style="color: black;">SetSize</span><span style="color: black;">&#40;</span>wx.<span style="color: black;">Size</span><span style="color: black;">&#40;</span>fw, th<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            <span style="color: #808080; font-style: italic;"># Best to allow the toolbar to resize!</span>
            sizer.<span style="color: black;">Add</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">toolbar</span>, <span style="color: #ff4500;">0</span>, wx.<span style="color: black;">GROW</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;">Fit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> createToolbar<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Create toolbar for controlling figure panel, override this method
        to provide custom toolbar
&nbsp;
        &quot;&quot;&quot;</span>
        toolbar = NavigationToolbar2Wx<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">canvas</span><span style="color: black;">&#41;</span>
        toolbar.<span style="color: black;">Realize</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> toolbar
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> GetToolBar<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #808080; font-style: italic;"># You will need to override GetToolBar if you are using an</span>
        <span style="color: #808080; font-style: italic;"># unmanaged toolbar in your frame</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">toolbar</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> onEraseBackground<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, evt<span style="color: black;">&#41;</span>:
        <span style="color: #808080; font-style: italic;"># this is supposed to prevent redraw flicker on some X servers...</span>
        <span style="color: #ff7700;font-weight:bold;">pass</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> getFigure<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Get figure of this panel
&nbsp;
        &quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">fig</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> FigurePanelXmlHandler<span style="color: black;">&#40;</span>xrc.<span style="color: black;">XmlResourceHandler</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><span style="color: black;">&#41;</span>:
        xrc.<span style="color: black;">XmlResourceHandler</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: #808080; font-style: italic;"># Specify the styles recognized by objects of this type</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">AddStyle</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;wxHAVE_TOOL_BAR&quot;</span>, HAVE_TOOL_BAR<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">AddWindowStyles</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># This method and the next one are required for XmlResourceHandlers</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> CanHandle<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, node<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">IsOfClass</span><span style="color: black;">&#40;</span>node, <span style="color: #483d8b;">&quot;FigurePanel&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> DoCreateResource<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">assert</span> <span style="color: #008000;">self</span>.<span style="color: black;">GetInstance</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>
&nbsp;
        figSize = <span style="color: #008000;">self</span>.<span style="color: black;">GetParamValue</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;figsize&quot;</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: #008000;">len</span><span style="color: black;">&#40;</span>figSize<span style="color: black;">&#41;</span>:
            figSize = <span style="color: #008000;">None</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            figSize = <span style="color: #008000;">map</span><span style="color: black;">&#40;</span><span style="color: #008000;">int</span>, figSize.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">','</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
        figDpi =  <span style="color: #008000;">self</span>.<span style="color: black;">GetParamValue</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;figdpi&quot;</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: #008000;">len</span><span style="color: black;">&#40;</span>figDpi<span style="color: black;">&#41;</span>:
            figDpi = <span style="color: #008000;">None</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            figDpi = <span style="color: #008000;">int</span><span style="color: black;">&#40;</span>figDpi<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># Now create the object</span>
        panel = FigurePanel<span style="color: black;">&#40;</span>
            figSize,
            figDpi,
            <span style="color: #008000;">self</span>.<span style="color: black;">GetParentAsWindow</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>,
            <span style="color: #008000;">self</span>.<span style="color: black;">GetID</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>,
            <span style="color: #008000;">self</span>.<span style="color: black;">GetPosition</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>,
            <span style="color: #008000;">self</span>.<span style="color: black;">GetSize</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>,
            <span style="color: #008000;">self</span>.<span style="color: black;">GetStyle</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;style&quot;</span>, <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>,
            <span style="color: #008000;">self</span>.<span style="color: black;">GetName</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;">return</span> panel
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
    app = wx.<span style="color: black;">PySimpleApp</span><span style="color: black;">&#40;</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>:
        <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: #66cc66;">*</span>args, <span style="color: #66cc66;">**</span>kwargs<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: #66cc66;">*</span>args, <span style="color: #66cc66;">**</span>kwargs<span style="color: black;">&#41;</span>
&nbsp;
            <span style="color: #008000;">self</span>.<span style="color: black;">figPanel</span> = FigurePanel<span style="color: black;">&#40;</span>parent=<span style="color: #008000;">self</span>, figSize=<span style="color: black;">&#40;</span><span style="color: #ff4500;">5</span>, <span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span>, figDpi=<span style="color: #ff4500;">75</span><span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">draw</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
            sizer = wx.<span style="color: black;">BoxSizer</span><span style="color: black;">&#40;</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;">figPanel</span>, <span style="color: #ff4500;">1</span>, wx.<span style="color: black;">GROW</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>
            <span style="color: #008000;">self</span>.<span style="color: black;">Fit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">def</span> draw<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
            fig = <span style="color: #008000;">self</span>.<span style="color: black;">figPanel</span>.<span style="color: black;">getFigure</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            plot = fig.<span style="color: black;">add_subplot</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">111</span><span style="color: black;">&#41;</span>
            plot.<span style="color: black;">plot</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>,<span style="color: #ff4500;">2</span>,<span style="color: #ff4500;">3</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
            plot.<span style="color: black;">set_ylabel</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'some numbers'</span><span style="color: black;">&#41;</span>
&nbsp;
    frame = Frame<span style="color: black;">&#40;</span>parent=<span style="color: #008000;">None</span>, title=<span style="color: #483d8b;">'Figure panel demo'</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></div></div>

<p>其實程式不難，很簡單，就只有這樣而已，配合XmlResource的InsertHandler就可以寫在xrc檔裡</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> figure_panel <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #66cc66;">*</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> getHandlers<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Get xrc handlers
&nbsp;
    &quot;&quot;&quot;</span>
    <span style="color: #ff7700;font-weight:bold;">from</span> wx <span style="color: #ff7700;font-weight:bold;">import</span> xrc
    <span style="color: #ff7700;font-weight:bold;">for</span> key, value <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">globals</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">iteritems</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">try</span>:
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">issubclass</span><span style="color: black;">&#40;</span>value, xrc.<span style="color: black;">XmlResourceHandler</span><span style="color: black;">&#41;</span>:
                <span style="color: #ff7700;font-weight:bold;">yield</span> value
        <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">TypeError</span>:
            <span style="color: #ff7700;font-weight:bold;">pass</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> installHandlers<span style="color: black;">&#40;</span>res<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Insert xml handlers into xml resource object
&nbsp;
    @param res: resources object to insert
    &quot;&quot;&quot;</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> handler <span style="color: #ff7700;font-weight:bold;">in</span> getHandlers<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
        res.<span style="color: black;">InsertHandler</span><span style="color: black;">&#40;</span>handler<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>有了xml handler，wxPython在讀你的xrc檔時就可以認得並且正確地建構出FigurePanel，有其它自訂的Control其實也都可以用這樣的方式來擴增到xrc檔中，xrc檔就可以像這樣寫</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;object</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;wxPanel&quot;</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;m_panel2&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;style<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>wxTAB_TRAVERSAL<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/style<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;object</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;wxBoxSizer&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;orient<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>wxVERTICAL<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/orient<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;object</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;sizeritem&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;option<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/option<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;flag<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>wxALL|wxEXPAND<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/flag<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;border<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>5<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/border<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;object</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;FigurePanel&quot;</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;figurePanel&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;style<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>wxHAVE_TOOL_BAR<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/style<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/object<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/object<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/object<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/object<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>一個簡單的例子，跑起來像這樣</p>
<p><a href="http://blog.ez2learn.com/wp-content/uploads/2009/07/figure_panel.png"><img class="alignnone size-medium wp-image-692" title="figure_panel" src="http://blog.ez2learn.com/wp-content/uploads/2009/07/figure_panel-300x123.png" alt="figure_panel" width="300" height="123" /></a></p>
<p>從此之後在wxPython中畫圖表就非常輕鬆了</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ez2learn.com/2009/07/22/wxpython-custom-control-figure-panel/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>開發wxPython的利器 : PyCrust</title>
		<link>http://blog.ez2learn.com/2009/06/17/nice-development-tool-pycrust/</link>
		<comments>http://blog.ez2learn.com/2009/06/17/nice-development-tool-pycrust/#comments</comments>
		<pubDate>Wed, 17 Jun 2009 14:56:48 +0000</pubDate>
		<dc:creator>victor</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[分享]]></category>
		<category><![CDATA[遊戲設計]]></category>
		<category><![CDATA[好書]]></category>
		<category><![CDATA[程式設計]]></category>
		<category><![CDATA[wxPython]]></category>

		<guid isPermaLink="false">http://blog.ez2learn.com/?p=592</guid>
		<description><![CDATA[一直想做的事 最近我在用wxPython開發某些程式，隨著開發的過程中，難免需要一些直接的測試，改動程式碼來進行測式似乎不是很明智的選擇，即使Python是直譯式的語言，每改一次重新啟動整個程式也是一種浪費，而且狀態每次也會重置，於是我開始想，我是否可以寫一個像Half-Life那樣的一個console整合到我的GUI中，如此一來我就可以在開發時直接進行某些測試，對某些特定的模組操作，如此一來開發的效率可以提升，對於程式而言也會更好除錯，但是雖然寫一個console不是什麼太難的事，但也不是什麼太輕鬆的事，為了早點完成程式，於是我就沒有真的去做 直到某本書的出現 : wxPython in action 當有一天我訂的書: wxPython in action終於來了，這本書要1500元，實在是不便宜，但是我認為卻很值得，我在書中發現我以前一直都沒仔細去注意到的東西，PyCrust，在翻過這章節時我驚訝地發現，這不就是我想做的嗎? 一個控制臺，可以讓我操作、觀察、測試我的GUI，而且整合的方法超簡單，只要一行指令 python pywrap.py main.py 在wx.py的package下的pywarp.py會自動找到app並且將PyCrust整合進去，在我程式中執行的畫面就像這樣 在截圖中我利用pycrust將gui的背景換成了紅色，它不止是一款簡單的GUI，因為他是動態載入模組的name space，和一般IDE不同的是，他的自動完成是動態的，一般的IDE只抓得到靜態的成員，但是即然是動態載入又是在執行中，有什麼成員一清二楚，所以基本上自動完成功能感覺非常地強大，但相對的弱點是對於靜態的部份比較麻煩 它除了可以自動整合到現有的wxPython gui程式中，更可以把裡面各個元件分開來獨立使用 所以它可以幹麻? 對我來說，PyCrust將會是像神兵利器般好用的工具，像是開發遊戲之類需要大量的調校，一個console或是動態的機制是免不了的，而console提供了立即且互動式的環境，有了PyCrust，就等於有了現成的console可以使用，在遊戲的開發過程中，開發者可以利用這個console動態地改變各種參數來觀察反應等等，當然開發遊戲只是其中一個應用的例子，即使在一般的GUI中也會是很好用的工具 順帶一提 wxPython in action真的是難得一見的好書，有別於一般的書，它使用問句來當做標題，但是不會因為這樣而零散雜亂，相反的，你可以很正式地看完一次，也可以很快速地掃過一次，當你需要什麼東西時，那些問句可以幫助你很快地找到你需要的東西，豐富的截圖和圖解更讓人不用費心去猜想到底做出來會是什麼樣子，或是想像到底是如何運作，如果要學wxPython，我覺得這本書真的是非常值得推薦，做為工具書，這本也是必備的一本]]></description>
			<content:encoded><![CDATA[<h2>一直想做的事</h2>
<p>最近我在用wxPython開發某些程式，隨著開發的過程中，難免需要一些直接的測試，改動程式碼來進行測式似乎不是很明智的選擇，即使Python是直譯式的語言，每改一次重新啟動整個程式也是一種浪費，而且狀態每次也會重置，於是我開始想，我是否可以寫一個像Half-Life那樣的一個console整合到我的GUI中，如此一來我就可以在開發時直接進行某些測試，對某些特定的模組操作，如此一來開發的效率可以提升，對於程式而言也會更好除錯，但是雖然寫一個console不是什麼太難的事，但也不是什麼太輕鬆的事，為了早點完成程式，於是我就沒有真的去做</p>
<h2>直到某本書的出現 : wxPython in action</h2>
<p>當有一天我訂的書: wxPython in action終於來了，這本書要1500元，實在是不便宜，但是我認為卻很值得，我在書中發現我以前一直都沒仔細去注意到的東西，PyCrust，在翻過這章節時我驚訝地發現，這不就是我想做的嗎? 一個控制臺，可以讓我操作、觀察、測試我的GUI，而且整合的方法超簡單，只要一行指令</p>
<blockquote><p>python pywrap.py main.py</p></blockquote>
<p>在wx.py的package下的pywarp.py會自動找到app並且將PyCrust整合進去，在我程式中執行的畫面就像這樣</p>
<p><a href="http://blog.ez2learn.com/wp-content/uploads/2009/06/pycrust.jpg"><img class="alignnone size-medium wp-image-593" title="pycrust" src="http://blog.ez2learn.com/wp-content/uploads/2009/06/pycrust-300x261.jpg" alt="pycrust" width="300" height="261" /></a></p>
<p>在截圖中我利用pycrust將gui的背景換成了紅色，它不止是一款簡單的GUI，因為他是動態載入模組的name space，和一般IDE不同的是，他的自動完成是動態的，一般的IDE只抓得到靜態的成員，但是即然是動態載入又是在執行中，有什麼成員一清二楚，所以基本上自動完成功能感覺非常地強大，但相對的弱點是對於靜態的部份比較麻煩</p>
<p>它除了可以自動整合到現有的wxPython gui程式中，更可以把裡面各個元件分開來獨立使用</p>
<h2>所以它可以幹麻?</h2>
<p>對我來說，PyCrust將會是像神兵利器般好用的工具，像是開發遊戲之類需要大量的調校，一個console或是動態的機制是免不了的，而console提供了立即且互動式的環境，有了PyCrust，就等於有了現成的console可以使用，在遊戲的開發過程中，開發者可以利用這個console動態地改變各種參數來觀察反應等等，當然開發遊戲只是其中一個應用的例子，即使在一般的GUI中也會是很好用的工具</p>
<h2>順帶一提</h2>
<p>wxPython in action真的是難得一見的好書，有別於一般的書，它使用問句來當做標題，但是不會因為這樣而零散雜亂，相反的，你可以很正式地看完一次，也可以很快速地掃過一次，當你需要什麼東西時，那些問句可以幫助你很快地找到你需要的東西，豐富的截圖和圖解更讓人不用費心去猜想到底做出來會是什麼樣子，或是想像到底是如何運作，如果要學wxPython，我覺得這本書真的是非常值得推薦，做為工具書，這本也是必備的一本</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ez2learn.com/2009/06/17/nice-development-tool-pycrust/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
