wxPython

http://wxpython.org/

Python で GUI の開発ができて、クロスプラットフォーム。

Windows 環境においては、スクリーンリーダーで操作可能なアプリケーションを構築できる。

スクリーンリーダー NVDA は GUI を wxPython で実装している。

wxPython 3.0 がリリースされているが Python 3.x には未対応で、Python 2.6/2.7 と互換性がある。

http://www.manning.com/rappin/

wxPython in Action, Noel Rappin and Robin Dunn, March, 2006 | 620 pages, ISBN: 1-932394-62-1

wxWidgets と wxPython のソース管理が github に移行したらしい:

Mac OS 10.8

更新 2013-10-09

port install wxPython ではなく wxPython30 を使えという話。

Carbon サポートが終了したためらしい。

$ sudo port selfupdate
$ sudo port install python27
$ sudo port select --set python python27
$ python --version
Python 2.7.5
$ sudo port install py27-wxpython-3.0

日本語:

$ cat wxHello.py
# wxhello.py
# coding: utf-8
from __future__ import unicode_literals
import wx
application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, "あああ Hello")
frame.Show()
application.MainLoop()
$ python wxHello.py 

wxPython 3.0 + Windows

since 2015-02-23

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
 
import wx
 
TITLE = "wxPython GUI"
 
class AppFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, title=TITLE, size=(500,200))
        fileMenu = wx.Menu()
        fileMenu.Append(1, "保存(&S)")
        self.Bind(wx.EVT_MENU, self.OnSave, id=1)
        fileMenu.Append(2, "終了(&E)")
        self.Bind(wx.EVT_MENU, self.OnExit, id=2)
        menubar = wx.MenuBar()
        menubar.Append(fileMenu, "ファイル(&F)")
        self.SetMenuBar(menubar)
        sizer = wx.BoxSizer(wx.VERTICAL)
        self.tc = wx.TextCtrl(self, -1, style=wx.TE_MULTILINE)
        sizer.Add(self.tc, 1, wx.EXPAND|wx.ALL)
        self.SetSizer(sizer)
        self.Layout()
        self.CreateStatusBar()
        self.SetStatusText("テスト")
 
    def OnExit(self, event):
        self.Close()
 
    def OnSave(self, event):
        wx.MessageBox("保存します", "保存", wx.OK|wx.ICON_INFORMATION, self)
 
 
if __name__ == '__main__':
    app = wx.App()
    frame = AppFrame()
    frame.Centre()
    frame.Show()
    app.MainLoop()

このアプリケーションは NVDA のオブジェクトナビゲーションで確認すると以下の構造になっている:

  • システム メニューバー
  • 最小化 ボタン
  • 最大化 ボタン
  • 閉じる ボタン
  • アプリケーション メニューバー
    • ファイル(F) サブメニュー
  • エディット 複数行 空行
  • ステータスバー
    • テスト テキスト

起動時には「エディット 複数行 空行」にフォーカスがある。

オブジェクトの生成と追加の順番を変えると、ウィンドウの見た目は同じだが、 オブジェクトナビゲーションの構造が変わる。

例えば:

class AppFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, title=TITLE, size=(500,200))
        self.CreateStatusBar()
        self.SetStatusText("テスト")
        fileMenu = wx.Menu()
        fileMenu.Append(1, "保存(&S)")
        self.Bind(wx.EVT_MENU, self.OnSave, id=1)
        fileMenu.Append(2, "終了(&E)")
        self.Bind(wx.EVT_MENU, self.OnExit, id=2)
        menubar = wx.MenuBar()
        menubar.Append(fileMenu, "ファイル(&F)")
        self.SetMenuBar(menubar)
        sizer = wx.BoxSizer(wx.VERTICAL)
        self.tc = wx.TextCtrl(self, -1, style=wx.TE_MULTILINE)
        sizer.Add(self.tc, 1, wx.EXPAND|wx.ALL)
        self.SetSizer(sizer)
        self.Layout()
  • システム メニューバー
  • 最小化 ボタン
  • 最大化 ボタン
  • 閉じる ボタン
  • アプリケーション メニューバー
    • ファイル(F) サブメニュー
  • ステータスバー
    • テスト テキスト
  • エディット 複数行 空行

どうやら「システム メニューバー」から「アプリケーション メニューバー」までの順番は固定で、 その後は wx.TextCtrl() と self.CreateStatusBar() の前後関係に依存しているらしい。

Mac OS 10.10 で py2app

since 2015-03-16

参考

wxPython のダウンロード

wxPython3.0-osx-cocoa-py2.7

ダウンロードして MacOSX 10.10.2 に入れる。

$ /usr/bin/python2.7 script.py 

これがうごくことをまず確認。 別の path の Python 処理系に wx が入ってしまうと動かない。

$ sudo /usr/bin/easy_install-2.7 py2app
Password:
Searching for py2app
Best match: py2app 0.7.3
Adding py2app 0.7.3 to easy-install.pth file
Installing py2applet script to /usr/local/bin

Using /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python
Processing dependencies for py2app
Finished processing dependencies for py2app

$ /usr/local/bin/py2applet  --make-setup script.py
Wrote setup.py

$ arch -i386 /usr/bin/python2.7 setup.py py2app -A
running py2app
creating /Users/nishimotz/work/wxpython/build/bdist.macosx-10.10-intel
creating /Users/nishimotz/work/wxpython/build/bdist.macosx-10.10-intel/python2.7-standalone
creating /Users/nishimotz/work/wxpython/build/bdist.macosx-10.10-intel/python2.7-standalone/app
creating /Users/nishimotz/work/wxpython/build/bdist.macosx-10.10-intel/python2.7-standalone/app/collect
creating /Users/nishimotz/work/wxpython/build/bdist.macosx-10.10-intel/python2.7-standalone/app/temp
creating build/bdist.macosx-10.10-intel/python2.7-standalone/app/lib-dynload
creating build/bdist.macosx-10.10-intel/python2.7-standalone/app/Frameworks
*** creating application bundle: script ***

dist の中の script (script.app) を Finder からダブルクリックすると起動する。

もしかすると arch -i386 は不要だったかも。

ports でもよかったらしい:

$ sudo port install py27-wxpython-3.0

$ /opt/local/bin/python --version
Python 2.7.9

$ /opt/local/bin/python script.py 

$ /opt/local/bin/python setup.py py2app -A
running py2app
creating /Users/nishimotz/work/wxpython/build/bdist.macosx-10.10-x86_64/python2.7-standalone/app
creating /Users/nishimotz/work/wxpython/build/bdist.macosx-10.10-x86_64/python2.7-standalone/app/collect
creating /Users/nishimotz/work/wxpython/build/bdist.macosx-10.10-x86_64/python2.7-standalone/app/temp
creating build/bdist.macosx-10.10-x86_64/python2.7-standalone/app/lib-dynload
creating build/bdist.macosx-10.10-x86_64/python2.7-standalone/app/Frameworks
*** creating application bundle: script ***
Done!
wxpython.txt · 最終更新: 2015/03/24 20:51 by Takuya Nishimoto
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0