Skip to content

Commit 38f4c76

Browse files
committed
deploy: 66e5eb1
1 parent ccf5dd3 commit 38f4c76

File tree

6 files changed

+311
-10
lines changed

6 files changed

+311
-10
lines changed

concepts/components/index.html

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,24 @@
371371
</span>
372372
</a>
373373

374+
</li>
375+
376+
<li class="md-nav__item">
377+
<a href="#core-components-020" class="md-nav__link">
378+
<span class="md-ellipsis">
379+
Core components (0.2.0)
380+
</span>
381+
</a>
382+
383+
</li>
384+
385+
<li class="md-nav__item">
386+
<a href="#platform-detection-and-android-context" class="md-nav__link">
387+
<span class="md-ellipsis">
388+
Platform detection and Android context
389+
</span>
390+
</a>
391+
374392
</li>
375393

376394
</ul>
@@ -783,6 +801,24 @@
783801
</span>
784802
</a>
785803

804+
</li>
805+
806+
<li class="md-nav__item">
807+
<a href="#core-components-020" class="md-nav__link">
808+
<span class="md-ellipsis">
809+
Core components (0.2.0)
810+
</span>
811+
</a>
812+
813+
</li>
814+
815+
<li class="md-nav__item">
816+
<a href="#platform-detection-and-android-context" class="md-nav__link">
817+
<span class="md-ellipsis">
818+
Platform detection and Android context
819+
</span>
820+
</a>
821+
786822
</li>
787823

788824
</ul>
@@ -831,6 +867,24 @@ <h2 id="constructor-pattern-020">Constructor pattern (0.2.0)<a class="headerlink
831867
<p>Notes:
832868
- <code>pn.Page</code> stores the Android <code>Activity</code> so components like <code>pn.Button()</code> and <code>pn.Label()</code> can construct their native counterparts.
833869
- If you construct views before the <code>Page</code> is created on Android, a runtime error will be raised because no <code>Context</code> is available.</p>
870+
<h2 id="core-components-020">Core components (0.2.0)<a class="headerlink" href="#core-components-020" title="Permanent link">&para;</a></h2>
871+
<p>Stabilized with contextless constructors on both platforms:</p>
872+
<ul>
873+
<li><code>Page</code></li>
874+
<li><code>StackView</code></li>
875+
<li><code>Label</code>, <code>Button</code></li>
876+
<li><code>ImageView</code></li>
877+
<li><code>TextField</code>, <code>TextView</code></li>
878+
<li><code>Switch</code></li>
879+
<li><code>ProgressView</code>, <code>ActivityIndicatorView</code></li>
880+
<li><code>WebView</code></li>
881+
</ul>
882+
<p>APIs are intentionally small and grow progressively in later releases. Properties and setters are kept consistent where supported by both platforms.</p>
883+
<h2 id="platform-detection-and-android-context">Platform detection and Android context<a class="headerlink" href="#platform-detection-and-android-context" title="Permanent link">&para;</a></h2>
884+
<ul>
885+
<li>Use <code>pythonnative.utils.IS_ANDROID</code> for platform checks when needed.</li>
886+
<li>On Android, <code>Page</code> records the current <code>Activity</code> so child views can acquire a <code>Context</code> implicitly. Constructing views before <code>Page</code> initialization will raise.</li>
887+
</ul>
834888

835889

836890

examples/hello-world/index.html

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -747,7 +747,30 @@
747747

748748

749749
<h1 id="hello-world">Hello World<a class="headerlink" href="#hello-world" title="Permanent link">&para;</a></h1>
750-
<p>A minimal placeholder example. Replace with a real example later.</p>
750+
<p>Create a simple page with a label and a button.</p>
751+
<div class="codehilite"><pre><span></span><code><span class="kn">import</span><span class="w"> </span><span class="nn">pythonnative</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">pn</span>
752+
753+
754+
<span class="k">class</span><span class="w"> </span><span class="nc">MainPage</span><span class="p">(</span><span class="n">pn</span><span class="o">.</span><span class="n">Page</span><span class="p">):</span>
755+
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">native_instance</span><span class="p">):</span>
756+
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">native_instance</span><span class="p">)</span>
757+
758+
<span class="k">def</span><span class="w"> </span><span class="nf">on_create</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
759+
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">on_create</span><span class="p">()</span>
760+
<span class="n">stack</span> <span class="o">=</span> <span class="n">pn</span><span class="o">.</span><span class="n">StackView</span><span class="p">()</span>
761+
<span class="n">label</span> <span class="o">=</span> <span class="n">pn</span><span class="o">.</span><span class="n">Label</span><span class="p">(</span><span class="s2">&quot;Hello, world!&quot;</span><span class="p">)</span>
762+
<span class="n">button</span> <span class="o">=</span> <span class="n">pn</span><span class="o">.</span><span class="n">Button</span><span class="p">(</span><span class="s2">&quot;Tap me&quot;</span><span class="p">)</span>
763+
<span class="n">button</span><span class="o">.</span><span class="n">set_on_click</span><span class="p">(</span><span class="k">lambda</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Hello tapped&quot;</span><span class="p">))</span>
764+
<span class="n">stack</span><span class="o">.</span><span class="n">add_view</span><span class="p">(</span><span class="n">label</span><span class="p">)</span>
765+
<span class="n">stack</span><span class="o">.</span><span class="n">add_view</span><span class="p">(</span><span class="n">button</span><span class="p">)</span>
766+
<span class="bp">self</span><span class="o">.</span><span class="n">set_root_view</span><span class="p">(</span><span class="n">stack</span><span class="p">)</span>
767+
</code></pre></div>
768+
769+
<p>Run it:</p>
770+
<div class="codehilite"><pre><span></span><code>pn<span class="w"> </span>run<span class="w"> </span>android
771+
<span class="c1"># or</span>
772+
pn<span class="w"> </span>run<span class="w"> </span>ios
773+
</code></pre></div>
751774

752775

753776

getting-started/index.html

Lines changed: 141 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,19 @@
257257

258258

259259

260+
<label class="md-nav__link md-nav__link--active" for="__toc">
261+
262+
263+
264+
<span class="md-ellipsis">
265+
Getting Started
266+
267+
</span>
268+
269+
270+
<span class="md-nav__icon md-icon"></span>
271+
</label>
272+
260273
<a href="./" class="md-nav__link md-nav__link--active">
261274

262275

@@ -269,6 +282,52 @@
269282

270283
</a>
271284

285+
286+
287+
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
288+
289+
290+
291+
292+
293+
294+
<label class="md-nav__title" for="__toc">
295+
<span class="md-nav__icon md-icon"></span>
296+
Table of contents
297+
</label>
298+
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
299+
300+
<li class="md-nav__item">
301+
<a href="#create-a-project" class="md-nav__link">
302+
<span class="md-ellipsis">
303+
Create a project
304+
</span>
305+
</a>
306+
307+
</li>
308+
309+
<li class="md-nav__item">
310+
<a href="#run-on-a-platform" class="md-nav__link">
311+
<span class="md-ellipsis">
312+
Run on a platform
313+
</span>
314+
</a>
315+
316+
</li>
317+
318+
<li class="md-nav__item">
319+
<a href="#clean" class="md-nav__link">
320+
<span class="md-ellipsis">
321+
Clean
322+
</span>
323+
</a>
324+
325+
</li>
326+
327+
</ul>
328+
329+
</nav>
330+
272331
</li>
273332

274333

@@ -727,6 +786,41 @@
727786

728787

729788

789+
<label class="md-nav__title" for="__toc">
790+
<span class="md-nav__icon md-icon"></span>
791+
Table of contents
792+
</label>
793+
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
794+
795+
<li class="md-nav__item">
796+
<a href="#create-a-project" class="md-nav__link">
797+
<span class="md-ellipsis">
798+
Create a project
799+
</span>
800+
</a>
801+
802+
</li>
803+
804+
<li class="md-nav__item">
805+
<a href="#run-on-a-platform" class="md-nav__link">
806+
<span class="md-ellipsis">
807+
Run on a platform
808+
</span>
809+
</a>
810+
811+
</li>
812+
813+
<li class="md-nav__item">
814+
<a href="#clean" class="md-nav__link">
815+
<span class="md-ellipsis">
816+
Clean
817+
</span>
818+
</a>
819+
820+
</li>
821+
822+
</ul>
823+
730824
</nav>
731825
</div>
732826
</div>
@@ -749,16 +843,55 @@ <h1 id="getting-started">Getting Started<a class="headerlink" href="#getting-sta
749843
pn<span class="w"> </span>--help
750844
</code></pre></div>
751845

846+
<h2 id="create-a-project">Create a project<a class="headerlink" href="#create-a-project" title="Permanent link">&para;</a></h2>
847+
<div class="codehilite"><pre><span></span><code>pn<span class="w"> </span>init<span class="w"> </span>MyApp
848+
</code></pre></div>
849+
850+
<p>This scaffolds:</p>
851+
<ul>
852+
<li><code>app/</code> with a minimal <code>main_page.py</code></li>
853+
<li><code>pythonnative.json</code> project config</li>
854+
<li><code>requirements.txt</code></li>
855+
<li><code>.gitignore</code></li>
856+
</ul>
857+
<p>A minimal <code>app/main_page.py</code> looks like:</p>
858+
<div class="codehilite"><pre><span></span><code><span class="kn">import</span><span class="w"> </span><span class="nn">pythonnative</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">pn</span>
859+
860+
861+
<span class="k">class</span><span class="w"> </span><span class="nc">MainPage</span><span class="p">(</span><span class="n">pn</span><span class="o">.</span><span class="n">Page</span><span class="p">):</span>
862+
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">native_instance</span><span class="p">):</span>
863+
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">native_instance</span><span class="p">)</span>
864+
865+
<span class="k">def</span><span class="w"> </span><span class="nf">on_create</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
866+
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">on_create</span><span class="p">()</span>
867+
<span class="n">stack</span> <span class="o">=</span> <span class="n">pn</span><span class="o">.</span><span class="n">StackView</span><span class="p">()</span>
868+
<span class="n">stack</span><span class="o">.</span><span class="n">add_view</span><span class="p">(</span><span class="n">pn</span><span class="o">.</span><span class="n">Label</span><span class="p">(</span><span class="s2">&quot;Hello from PythonNative!&quot;</span><span class="p">))</span>
869+
<span class="n">button</span> <span class="o">=</span> <span class="n">pn</span><span class="o">.</span><span class="n">Button</span><span class="p">(</span><span class="s2">&quot;Tap me&quot;</span><span class="p">)</span>
870+
<span class="n">button</span><span class="o">.</span><span class="n">set_on_click</span><span class="p">(</span><span class="k">lambda</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Button clicked&quot;</span><span class="p">))</span>
871+
<span class="n">stack</span><span class="o">.</span><span class="n">add_view</span><span class="p">(</span><span class="n">button</span><span class="p">)</span>
872+
<span class="bp">self</span><span class="o">.</span><span class="n">set_root_view</span><span class="p">(</span><span class="n">stack</span><span class="p">)</span>
873+
</code></pre></div>
874+
875+
<h2 id="run-on-a-platform">Run on a platform<a class="headerlink" href="#run-on-a-platform" title="Permanent link">&para;</a></h2>
876+
<div class="codehilite"><pre><span></span><code>pn<span class="w"> </span>run<span class="w"> </span>android
877+
<span class="c1"># or</span>
878+
pn<span class="w"> </span>run<span class="w"> </span>ios
879+
</code></pre></div>
880+
752881
<ul>
753-
<li>Install: <code>pip install pythonnative</code></li>
754-
<li>Create a project: <code>pn init my_app</code></li>
755-
<li>Scaffolds <code>app/</code>, <code>pythonnative.json</code>, <code>requirements.txt</code>, <code>.gitignore</code></li>
756-
<li>Run: <code>pn run android</code> or <code>pn run ios</code></li>
757-
<li>Uses bundled templates; copies your <code>app/</code> into the platform project</li>
758-
<li>On Android, <code>pn.Page</code> provides the Activity context so components can be created without passing a context</li>
759-
<li>Clean: <code>pn clean</code></li>
760-
<li>Removes the <code>build/</code> directory safely</li>
882+
<li>Uses bundled templates (no network required for scaffolding)</li>
883+
<li>Copies your <code>app/</code> into the generated project</li>
761884
</ul>
885+
<p>If you just want to scaffold the platform project without building, use:</p>
886+
<div class="codehilite"><pre><span></span><code>pn<span class="w"> </span>run<span class="w"> </span>android<span class="w"> </span>--prepare-only
887+
pn<span class="w"> </span>run<span class="w"> </span>ios<span class="w"> </span>--prepare-only
888+
</code></pre></div>
889+
890+
<p>This stages files under <code>build/</code> so you can open them in Android Studio or Xcode.</p>
891+
<h2 id="clean">Clean<a class="headerlink" href="#clean" title="Permanent link">&para;</a></h2>
892+
<p>Remove the build artifacts safely:</p>
893+
<div class="codehilite"><pre><span></span><code>pn<span class="w"> </span>clean
894+
</code></pre></div>
762895

763896

764897

guides/android/index.html

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,24 @@
549549
</span>
550550
</a>
551551

552+
</li>
553+
554+
<li class="md-nav__item">
555+
<a href="#clean" class="md-nav__link">
556+
<span class="md-ellipsis">
557+
Clean
558+
</span>
559+
</a>
560+
561+
</li>
562+
563+
<li class="md-nav__item">
564+
<a href="#troubleshooting" class="md-nav__link">
565+
<span class="md-ellipsis">
566+
Troubleshooting
567+
</span>
568+
</a>
569+
552570
</li>
553571

554572
</ul>
@@ -801,6 +819,24 @@
801819
</span>
802820
</a>
803821

822+
</li>
823+
824+
<li class="md-nav__item">
825+
<a href="#clean" class="md-nav__link">
826+
<span class="md-ellipsis">
827+
Clean
828+
</span>
829+
</a>
830+
831+
</li>
832+
833+
<li class="md-nav__item">
834+
<a href="#troubleshooting" class="md-nav__link">
835+
<span class="md-ellipsis">
836+
Troubleshooting
837+
</span>
838+
</a>
839+
804840
</li>
805841

806842
</ul>
@@ -836,6 +872,16 @@ <h2 id="run">Run<a class="headerlink" href="#run" title="Permanent link">&para;<
836872
</code></pre></div>
837873

838874
<p>This will stage files under <code>build/android/android_template</code> so you can open it in Android Studio if you prefer.</p>
875+
<h2 id="clean">Clean<a class="headerlink" href="#clean" title="Permanent link">&para;</a></h2>
876+
<p>Remove the build directory safely:</p>
877+
<div class="codehilite"><pre><span></span><code>pn<span class="w"> </span>clean
878+
</code></pre></div>
879+
880+
<h2 id="troubleshooting">Troubleshooting<a class="headerlink" href="#troubleshooting" title="Permanent link">&para;</a></h2>
881+
<ul>
882+
<li>If <code>gradlew</code> fails due to JDK path on macOS, ensure <code>JAVA_HOME</code> is set (the CLI attempts to detect Homebrew <code>openjdk@17</code>).</li>
883+
<li>Ensure an Android emulator or device is available for <code>installDebug</code>.</li>
884+
</ul>
839885

840886

841887

0 commit comments

Comments
 (0)