WxPython
Python wrapper for wxWidgets
- 4 min read
- 4 chapters
Related on Lably
Through Graphical user interface, Python (programming language) and Web page
History
In 1995, Robin Dunn needed a GUI application to be deployed on HP-UX systems but also run Windows 3.1 within short time frame. He needed a cross-platform solution. While evaluating free and commercial solutions, he ran across Python bindings on the wxWidgets toolkit webpage (known as wxWindows at the time). This was Dunn's introduction to Python. Together with Harri Pasanen and Edward Zimmerman he developed those initial bindings into wxPython 0.2.
In August 1998, version 0.3 of wxPython was released. It was built for wxWidgets 2.0 and ran on Win32, with a wxGTK version in the works.
The first versions of the wrapper were created by hand. However, the code became difficult to maintain and keep synchronized with wxWidgets releases. By 1997, versions were created with SWIG, greatly decreasing the amount of work to update the wrapper.
Project Phoenix
In 2010, the Project Phoenix began; an effort to clean up the wxPython implementation and in the process make it compatible with Python 3. The project is a new implementation of wxPython, focused on improving speed, maintainability and extensibility. Like the previous version of wxPython, it wraps the wxWidgets C++ toolkit and provides access to the user interface portions of the wxWidgets API.
With the release of 4.0.0a1 wxPython in 2017, the Project Phoenix version became the official version. wxPython 4.x is the current version being developed as of June 2022.
Sign in to keep reading
3 more chapters are free with a Lably account.
Use
wxPython enables Python to be used for cross-platform GUI applications requiring very little, if any, platform-specific code.
Example
This is a simple "Hello world" module, depicting the creation of the two main objects in wxPython (the main window object and the application object), followed by passing the control to the event-driven system (by calling MainLoop()) which manages the user-interactive part of the program.
<span id="mwUg"></span><span class="ch" id="mwUw">#!/usr/bin/env python3</span> <span class="kn" id="mwVA">import</span><span class="w" id="mwVQ"> </span><span class="nn" id="mwVg">wx</span> <span class="n" id="mwVw">app</span> <span class="o" id="mwWA">=</span> <span class="n" id="mwWQ">wx</span><span class="o" id="mwWg">.</span><span class="n" id="mwWw">App</span><span class="p" id="mwXA">(</span><span class="kc" id="mwXQ">False</span><span class="p" id="mwXg">)</span> <span class="c1" id="mwXw"># Create a new app, don't redirect stdout/stderr to a window.</span> <span class="n" id="mwYA">frame</span> <span class="o" id="mwYQ">=</span> <span class="n" id="mwYg">wx</span><span class="o" id="mwYw">.</span><span class="n" id="mwZA">Frame</span><span class="p" id="mwZQ">(</span><span class="kc" id="mwZg">None</span><span class="p" id="mwZw">,</span> <span class="n" id="mwaA">title</span><span class="o" id="mwaQ">=</span><span class="s2" id="mwag">"Hello World"</span><span class="p" id="mwaw">)</span> <span class="c1" id="mwbA"># A Frame is a top-level window.</span> <span class="n" id="mwbQ">frame</span><span class="o" id="mwbg">.</span><span class="n" id="mwbw">Show</span><span class="p" id="mwcA">(</span><span class="kc" id="mwcQ">True</span><span class="p" id="mwcg">)</span> <span class="c1" id="mwcw"># Show the frame.</span> <span class="n" id="mwdA">app</span><span class="o" id="mwdQ">.</span><span class="n" id="mwdg">MainLoop</span><span class="p" id="mwdw">()</span>
This is another example of the wxPython Close Button with wxPython GUI display show in Windows 10 operating system.
<span id="mwfw"></span><span class="kn" id="mwgA">import</span><span class="w" id="mwgQ"> </span><span class="nn" id="mwgg">wx</span> <span class="k" id="mwgw">class</span><span class="w" id="mwhA"> </span><span class="nc" id="mwhQ">WxButton</span><span class="p" id="mwhg">(</span><span class="n" id="mwhw">wx</span><span class="o" id="mwiA">.</span><span class="n" id="mwiQ">Frame</span><span class="p" id="mwig">):</span> <span class="k" id="mwiw">def</span><span class="w" id="mwjA"> </span><span class="fm" id="mwjQ">__init__</span><span class="p" id="mwjg">(</span><span class="bp" id="mwjw">self</span><span class="p" id="mwkA">,</span> <span class="o" id="mwkQ">*</span><span class="n" id="mwkg">args</span><span class="p" id="mwkw">,</span> <span class="o" id="mwlA">**</span><span class="n" id="mwlQ">kw</span><span class="p" id="mwlg">):</span> <span class="nb" id="mwlw">super</span><span class="p" id="mwmA">(</span><span class="n" id="mwmQ">WxButton</span><span class="p" id="mwmg">,</span> <span class="bp" id="mwmw">self</span><span class="p" id="mwnA">)</span><span class="o" id="mwnQ">.</span><span class="fm" id="mwng">__init__</span><span class="p" id="mwnw">(</span><span class="o" id="mwoA">*</span><span class="n" id="mwoQ">args</span><span class="p" id="mwog">,</span> <span class="o" id="mwow">**</span><span class="n" id="mwpA">kw</span><span class="p" id="mwpQ">)</span> <span class="bp" id="mwpg">self</span><span class="o" id="mwpw">.</span><span class="n" id="mwqA">InitUI</span><span class="p" id="mwqQ">()</span> <span class="k" id="mwqg">def</span><span class="w" id="mwqw"> </span><span class="nf" id="mwrA">InitUI</span><span class="p" id="mwrQ">(</span><span class="bp" id="mwrg">self</span><span class="p" id="mwrw">):</span> <span class="n" id="mwsA">pnl</span> <span class="o" id="mwsQ">=</span> <span class="n" id="mwsg">wx</span><span class="o" id="mwsw">.</span><span class="n" id="mwtA">Panel</span><span class="p" id="mwtQ">(</span><span class="bp" id="mwtg">self</span><span class="p" id="mwtw">)</span> <span class="n" id="mwuA">closeButton</span> <span class="o" id="mwuQ">=</span> <span class="n" id="mwug">wx</span><span class="o" id="mwuw">.</span><span class="n" id="mwvA">Button</span><span class="p" id="mwvQ">(</span><span class="n" id="mwvg">pnl</span><span class="p" id="mwvw">,</span> <span class="n" id="mwwA">label</span><span class="o" id="mwwQ">=</span><span class="s1" id="mwwg">'Close Me'</span><span class="p" id="mwww">,</span> <span class="n" id="mwxA">pos</span><span class="o" id="mwxQ">=</span><span class="p" id="mwxg">(</span><span class="mi" id="mwxw">20</span><span class="p" id="mwyA">,</span> <span class="mi" id="mwyQ">20</span><span class="p" id="mwyg">))</span> <span class="n" id="mwyw">closeButton</span><span class="o" id="mwzA">.</span><span class="n" id="mwzQ">Bind</span><span class="p" id="mwzg">(</span><span class="n" id="mwzw">wx</span><span class="o" id="mw0A">.</span><span class="n" id="mw0Q">EVT_BUTTON</span><span class="p" id="mw0g">,</span> <span class="bp" id="mw0w">self</span><span class="o" id="mw1A">.</span><span class="n" id="mw1Q">OnClose</span><span class="p" id="mw1g">)</span> <span class="bp" id="mw1w">self</span><span class="o" id="mw2A">.</span><span class="n" id="mw2Q">SetSize</span><span class="p" id="mw2g">((</span><span class="mi" id="mw2w">350</span><span class="p" id="mw3A">,</span> <span class="mi" id="mw3Q">250</span><span class="p" id="mw3g">))</span> <span class="bp" id="mw3w">self</span><span class="o" id="mw4A">.</span><span class="n" id="mw4Q">SetTitle</span><span class="p" id="mw4g">(</span><span class="s1" id="mw4w">'Close Button'</span><span class="p" id="mw5A">)</span> <span class="bp" id="mw5Q">self</span><span class="o" id="mw5g">.</span><span class="n" id="mw5w">Centre</span><span class="p" id="mw6A">()</span> <span class="k" id="mw6Q">def</span><span class="w" id="mw6g"> </span><span class="nf" id="mw6w">OnClose</span><span class="p" id="mw7A">(</span><span class="bp" id="mw7Q">self</span><span class="p" id="mw7g">,</span> <span class="n" id="mw7w">e</span><span class="p" id="mw8A">):</span> <span class="bp" id="mw8Q">self</span><span class="o" id="mw8g">.</span><span class="n" id="mw8w">Close</span><span class="p" id="mw9A">(</span><span class="kc" id="mw9Q">True</span><span class="p" id="mw9g">)</span> <span class="k" id="mw9w">def</span><span class="w" id="mw-A"> </span><span class="nf" id="mw-Q">main</span><span class="p" id="mw-g">():</span> <span class="n" id="mw-w">app</span> <span class="o" id="mw_A">=</span> <span class="n" id="mw_Q">wx</span><span class="o" id="mw_g">.</span><span class="n" id="mw_w">App</span><span class="p" id="mwAQA">()</span> <span class="n" id="mwAQE">ex</span> <span class="o" id="mwAQI">=</span> <span class="n" id="mwAQM">WxButton</span><span class="p" id="mwAQQ">(</span><span class="kc" id="mwAQU">None</span><span class="p" id="mwAQY">)</span> <span class="n" id="mwAQc">ex</span><span class="o" id="mwAQg">.</span><span class="n" id="mwAQk">Show</span><span class="p" id="mwAQo">()</span> <span class="n" id="mwAQs">app</span><span class="o" id="mwAQw">.</span><span class="n" id="mwAQ0">MainLoop</span><span class="p" id="mwAQ4">()</span> <span class="k" id="mwAQ8">if</span> <span class="vm" id="mwARA">__name__</span> <span class="o" id="mwARE">==</span> <span class="s2" id="mwARI">"__main__"</span><span class="p" id="mwARM">:</span> <span class="n" id="mwARQ">main</span><span class="p" id="mwARU">()</span>
License
Being a wrapper, wxPython uses the same free software license used by wxWidgets (wxWindows License)—which is approved by Free Software Foundation and Open Source Initiative.
Applications developed with wxPython
- Chandler, a personal information manager
- Dropbox, desktop client for the Dropbox cloud-based storage
- Editra, a multi-platform text editor
- Google Drive, desktop client for the Google cloud-based storage system
- GRASS GIS, a free, open source geographical information system
- Métamorphose, a batch renamer
- Phatch, a photo batch processor
- PlayOnLinux and PlayOnMac, Wine front-ends
- PsychoPy, experiment creation tool for neuroscience and psychology research

