<?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>BDC Software &#187; pyS60</title>
	<atom:link href="http://www.bdcsoftware.com/category/pys60/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bdcsoftware.com</link>
	<description>Experience Matters</description>
	<lastBuildDate>Fri, 04 Jun 2010 17:55:46 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Pys60 App Skeleton</title>
		<link>http://www.bdcsoftware.com/pys60-app-skeleton/</link>
		<comments>http://www.bdcsoftware.com/pys60-app-skeleton/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 17:29:28 +0000</pubDate>
		<dc:creator>raf</dc:creator>
				<category><![CDATA[pyS60]]></category>

		<guid isPermaLink="false">http://www.bdcsoftware.com/?p=451</guid>
		<description><![CDATA[Over the development of a few applications with pys60 I have standardized on an app skeleton that simplifies and speeds-up the initial process of getting something going. The basic idea is to have an application shell up and running on various environments without needing a lot of configuration changes as quickly as possible. By default [...]]]></description>
			<content:encoded><![CDATA[<p>Over the development of a few applications with pys60 I have standardized on an app skeleton that simplifies and speeds-up the initial process of getting something going. The basic idea is to have an application shell up and running on various environments without needing a lot of configuration changes as quickly as possible. By default the app will run fine in the following environments without any changes: emulator, phone (script shell), phone (stand-alone).</p>
<p>The core idea behind the skeleton is that of a simple launcher and a directory holding the application. The launcher is responsible for setting the import paths based on the environment and bootstraping the application with generic exception handling. The actual application code is in a separate module. The application and data views are also based on individual classes. This allows for simple navigation between views / screens even in situations where the hierarchy is quite complex.</p>
<p>The <a href='http://www.bdcsoftware.com/wp-content/uploads/2009/10/app_skeleton.zip'>sample skeleton</a> project zip file has the following contents:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">app_myapp.py    
AppFolder
    logger.py
    debug.py
    myapp.py</pre></div></div>

<p>Here is how you can get started with your own app in seconds in a emulator (the steps below are based on N97 emulator installed in default location and the paths will have to change to reflect any other emulator editions) :</p>
<ol>
<li>Unzip the <a href='http://www.bdcsoftware.com/wp-content/uploads/2009/10/app_skeleton.zip'>app_skeleton</a> into a temp folder</li>
<li>Copy app_myapp.py to python examples folder (in my case here it would be c:\s60&#8230;.)</li>
<li>Copy the app folder to any location on the emulator C: drive. I usually place the app directory in the c:\data\ folder</li>
</ol>
<p>At this point you can either launch the app from the Python Script Shell</p>
<p>Hopefully the launcher code is self explanatory and will illustrate whats happening behind the scenes when you launch the app:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;MyApp Name&quot;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> appuifw
<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;">os</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>
<span style="color: #ff7700;font-weight:bold;">import</span> e32
&nbsp;
<span style="color: #ff7700;font-weight:bold;">try</span>:
    <span style="color: #ff7700;font-weight:bold;">global</span> DATA_PATH
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Loading, please wait...&quot;</span>
    e32.<span style="color: black;">ao_sleep</span><span style="color: black;">&#40;</span>.1<span style="color: black;">&#41;</span>
    e32.<span style="color: black;">ao_yield</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> e32.<span style="color: black;">in_emulator</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> e32.<span style="color: black;">pys60_version_info</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span> == <span style="color: #ff4500;">1</span> <span style="color: #ff7700;font-weight:bold;">and</span> e32.<span style="color: black;">pys60_version_info</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #ff4500;">5</span>:
            DATA_PATH = <span style="color: #483d8b;">'c:<span style="color: #000099; font-weight: bold;">\\</span>python<span style="color: #000099; font-weight: bold;">\\</span>myapp_folder<span style="color: #000099; font-weight: bold;">\\</span>'</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            DATA_PATH = <span style="color: #483d8b;">'c:<span style="color: #000099; font-weight: bold;">\\</span>data<span style="color: #000099; font-weight: bold;">\\</span>python<span style="color: #000099; font-weight: bold;">\\</span>myapp_folder<span style="color: #000099; font-weight: bold;">\\</span>'</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
        <span style="color: #808080; font-style: italic;">#create app dir if neccessery</span>
        drive = <span style="color: #483d8b;">'e'</span>
        <span style="color: #ff7700;font-weight:bold;">if</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><span style="color: #483d8b;">'e:'</span><span style="color: black;">&#41;</span>:
            drive = <span style="color: #483d8b;">'e'</span>
            DATA_PATH = <span style="color: #483d8b;">'e:<span style="color: #000099; font-weight: bold;">\\</span>data<span style="color: #000099; font-weight: bold;">\\</span>myapp_folder'</span>
        <span style="color: #ff7700;font-weight:bold;">elif</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><span style="color: #483d8b;">'c:'</span><span style="color: black;">&#41;</span>:
            drive = <span style="color: #483d8b;">'c'</span>
            DATA_PATH = <span style="color: #483d8b;">'c:<span style="color: #000099; font-weight: bold;">\\</span>data<span style="color: #000099; font-weight: bold;">\\</span>myapp_folder'</span>
        <span style="color: #ff7700;font-weight:bold;">try</span>:
            <span style="color: #dc143c;">os</span>.<span style="color: black;">makedirs</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'%s:<span style="color: #000099; font-weight: bold;">\\</span>data<span style="color: #000099; font-weight: bold;">\\</span>myapp_folder'</span> <span style="color: #66cc66;">%</span> drive<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">except</span>: <span style="color: #ff7700;font-weight:bold;">pass</span>
        <span style="color: #808080; font-style: italic;">#also add current script path (if we are running from a sis file)</span>
        <span style="color: #dc143c;">sys</span>.<span style="color: black;">path</span>.<span style="color: black;">insert</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</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><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;">#not 100% sure this is needed</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</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>DATA_PATH<span style="color: black;">&#41;</span> == <span style="color: #008000;">False</span>:
        appuifw.<span style="color: black;">note</span><span style="color: black;">&#40;</span>u<span style="color: #483d8b;">'Unable to set data directory. Exiting Application.'</span><span style="color: black;">&#41;</span>
        e32.<span style="color: black;">ao_sleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>
        appuifw.<span style="color: black;">app</span>.<span style="color: black;">set_exit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #dc143c;">sys</span>.<span style="color: black;">exit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #dc143c;">sys</span>.<span style="color: black;">path</span> = <span style="color: #dc143c;">sys</span>.<span style="color: black;">path</span> + <span style="color: black;">&#91;</span>DATA_PATH<span style="color: black;">&#93;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">import</span> myapp
&nbsp;
    old_title = appuifw.<span style="color: black;">app</span>.<span style="color: black;">title</span>
    exit_handler = appuifw.<span style="color: black;">app</span>.<span style="color: black;">exit_key_handler</span>
&nbsp;
    appuifw.<span style="color: black;">app</span>.<span style="color: black;">screen</span> = <span style="color: #483d8b;">'normal'</span>
&nbsp;
    menu = appuifw.<span style="color: black;">app</span>.<span style="color: black;">menu</span>
&nbsp;
    myApp = myapp.<span style="color: black;">App</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    myApp.<span style="color: black;">run</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    myApp.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> e32.<span style="color: black;">in_emulator</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
        appuifw.<span style="color: black;">app</span>.<span style="color: black;">title</span> = old_title
        appuifw.<span style="color: black;">app</span>.<span style="color: black;">exit_key_handler</span> = exit_handler
        appuifw.<span style="color: black;">app</span>.<span style="color: black;">menu</span> = menu
    <span style="color: #ff7700;font-weight:bold;">else</span>:
        appuifw.<span style="color: black;">app</span>.<span style="color: black;">title</span> = old_title
        appuifw.<span style="color: black;">menu</span> = <span style="color: #008000;">None</span>
<span style="color: #ff7700;font-weight:bold;">except</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;">traceback</span>
    <span style="color: #ff7700;font-weight:bold;">import</span> e32
    <span style="color: #ff7700;font-weight:bold;">import</span> appuifw
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> e32.<span style="color: black;">in_emulator</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> e32.<span style="color: black;">pys60_version_info</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span> == <span style="color: #ff4500;">1</span> <span style="color: #ff7700;font-weight:bold;">and</span> e32.<span style="color: black;">pys60_version_info</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #ff4500;">5</span>:
            DATA_PATH = <span style="color: #483d8b;">'c:<span style="color: #000099; font-weight: bold;">\\</span>python<span style="color: #000099; font-weight: bold;">\\</span>myapp_folder'</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            DATA_PATH = <span style="color: #483d8b;">'c:<span style="color: #000099; font-weight: bold;">\\</span>data<span style="color: #000099; font-weight: bold;">\\</span>python<span style="color: #000099; font-weight: bold;">\\</span>myapp_folder'</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
        DATA_PATH = <span style="color: #483d8b;">'e:<span style="color: #000099; font-weight: bold;">\\</span>data<span style="color: #000099; font-weight: bold;">\\</span>myapp_folder'</span>
    <span style="color: #dc143c;">sys</span>.<span style="color: black;">path</span> = <span style="color: #dc143c;">sys</span>.<span style="color: black;">path</span> + <span style="color: black;">&#91;</span>DATA_PATH<span style="color: black;">&#93;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">from</span> logger <span style="color: #ff7700;font-weight:bold;">import</span> Logger
&nbsp;
    errlog  = Logger<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;%s<span style="color: #000099; font-weight: bold;">\\</span>myapp_error_log.txt&quot;</span> <span style="color: #66cc66;">%</span> DATA_PATH<span style="color: black;">&#41;</span>
    errlog.<span style="color: black;">start_trace</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    appuifw.<span style="color: black;">app</span>.<span style="color: black;">screen</span> = <span style="color: #483d8b;">&quot;normal&quot;</span>               <span style="color: #808080; font-style: italic;"># Restore screen to normal size.</span>
    appuifw.<span style="color: black;">app</span>.<span style="color: black;">focus</span> = <span style="color: #008000;">None</span>                    <span style="color: #808080; font-style: italic;"># Disable focus callback.</span>
    body = appuifw.<span style="color: black;">Text</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    appuifw.<span style="color: black;">app</span>.<span style="color: black;">body</span> = body                     <span style="color: #808080; font-style: italic;"># Create and use a text control.</span>
    exitlock = e32.<span style="color: black;">Ao_lock</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> exithandler<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>: exitlock.<span style="color: #dc143c;">signal</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    appuifw.<span style="color: black;">app</span>.<span style="color: black;">exit_key_handler</span> = exithandler  <span style="color: #808080; font-style: italic;"># Override softkey handler.</span>
    appuifw.<span style="color: black;">app</span>.<span style="color: black;">menu</span> = <span style="color: black;">&#91;</span><span style="color: black;">&#40;</span>u<span style="color: #483d8b;">&quot;Exit&quot;</span>, exithandler<span style="color: black;">&#41;</span><span style="color: black;">&#93;</span> <span style="color: #808080; font-style: italic;"># Override application menu.</span>
    errlog.<span style="color: black;">writeline</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;">join</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">traceback</span>.<span style="color: black;">format_exception</span><span style="color: black;">&#40;</span><span style="color: #66cc66;">*</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">exc_info</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: black;">&#41;</span>
    body.<span style="color: #008000;">set</span><span style="color: black;">&#40;</span><span style="color: #008000;">unicode</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;">join</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">traceback</span>.<span style="color: black;">format_exception</span><span style="color: black;">&#40;</span><span style="color: #66cc66;">*</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">exc_info</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: black;">&#41;</span><span style="color: black;">&#41;</span>
    exitlock.<span style="color: black;">wait</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>                             <span style="color: #808080; font-style: italic;"># Wait for exit key press.</span>
    appuifw.<span style="color: black;">app</span>.<span style="color: black;">set_exit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>The launcher will create a &#8216;myapp&#8217; application object and call the run method. From then on, the run method is responsible for creating the first view and for creating a signal lock until the view is closed or an app exit is requested by the user.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdcsoftware.com/pys60-app-skeleton/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
