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 に移行したらしい:
更新 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
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 のオブジェクトナビゲーションで確認すると以下の構造になっている:
起動時には「エディット 複数行 空行」にフォーカスがある。
オブジェクトの生成と追加の順番を変えると、ウィンドウの見た目は同じだが、 オブジェクトナビゲーションの構造が変わる。
例えば:
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()
どうやら「システム メニューバー」から「アプリケーション メニューバー」までの順番は固定で、 その後は wx.TextCtrl() と self.CreateStatusBar() の前後関係に依存しているらしい。
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!