差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
| python:wxpython [2020/02/03 12:55] – [wxPython] ともやん | python:wxpython [2021/06/12 12:32] (現在) – [distutils.msvc9compiler の find_vcvarsall() の実装 (Python 3.8)] ともやん | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| ====== wxPython ====== | ====== wxPython ====== | ||
| - | {{:python: | + | {{python: |
| 本家: [[https:// | 本家: [[https:// | ||
| ソースコード: | ソースコード: | ||
| - | ・[[https:// | + | ・[[git>wxWidgets/ |
| - | ・[[https:// | + | ・[[git>wxWidgets/ |
| リリース: | リリース: | ||
| ・[[https:// | ・[[https:// | ||
| - | ・[[https:// | + | ・[[sf>wxpython/ |
| \\ | \\ | ||
| - | wxPythonは、wxWidgets C++ クラス ライブラリ(クロス プラットフォーム GUIライブラリ)のPython言語向けバインディングである。つまり、PythonからwxWidgetsを利用できるようにしたものである。\\ | + | wxPythonは、wxWidgets C++ クラス ライブラリ(クロス プラットフォーム GUI ライブラリ)の Python 言語向けバインディングである。つまり、Python から wxWidgets を利用できるようにしたものである。\\ |
| - | wxPythonを使いPythonでプログラムを記述すると、スクリプト言語でGUIアプリケーションを作成できる。さらに、そのプログラムはLinuxやWindows、Mac OS Xで同じように動作する。(PythonとwxPythonが利用できる様々なプラットフォームで動作する。) | + | wxPython を使い Python でプログラムを記述すると、スクリプト言語で GUI アプリケーションを作成できる。さらに、そのプログラムは Linux や Windows、Mac OS Xで同じように動作する。(Python と wxPython が利用できる様々なプラットフォームで動作する。) |
| + | |||
| + | ===== インストール ===== | ||
| + | **wxPython Phoenix 4**系\\ | ||
| + | <code powershell> | ||
| + | $ pip install wxpython | ||
| + | </ | ||
| + | <WRAP prewrap 100% # | ||
| + | < | ||
| + | Collecting wxpython | ||
| + | Downloading wxPython-4.1.1-cp39-cp39-win_amd64.whl (18.1 MB) | ||
| + | | ||
| + | Collecting six | ||
| + | Downloading six-1.16.0-py2.py3-none-any.whl (11 kB) | ||
| + | Collecting pillow | ||
| + | Downloading Pillow-8.2.0-cp39-cp39-win_amd64.whl (2.2 MB) | ||
| + | | ||
| + | Collecting numpy; python_version >= " | ||
| + | Downloading numpy-1.20.3-cp39-cp39-win_amd64.whl (13.7 MB) | ||
| + | | ||
| + | Installing collected packages: six, pillow, numpy, wxpython | ||
| + | Successfully installed numpy-1.20.3 pillow-8.2.0 six-1.16.0 wxpython-4.1.1 | ||
| + | </ | ||
| + | </ | ||
| ===== ビルドする場合 ===== | ===== ビルドする場合 ===== | ||
| + | |||
| + | ==== wxPython Classic 3系 ==== | ||
| フォルダ構成を以下のようにする。\\ | フォルダ構成を以下のようにする。\\ | ||
| ^ build_folder ^^ | ^ build_folder ^^ | ||
| 行 32: | 行 57: | ||
| > cd wxWidgets | > cd wxWidgets | ||
| > git checkout -f v3.0.2 | > git checkout -f v3.0.2 | ||
| + | > git submodule update --init | ||
| + | > git status | ||
| + | HEAD detached at v3.0.2 | ||
| + | nothing to commit, working tree clean | ||
| </ | </ | ||
| 行 48: | 行 77: | ||
| 予め [[http:// | 予め [[http:// | ||
| < | < | ||
| - | > cd wxPython-Classic | + | > cd wxPython-Classic\wxPython |
| - | > " | + | |
| - | Setting environment for using Microsoft Visual Studio 2008 x86 tools. | + | |
| </ | </ | ||
| x32 ビルド\\ | x32 ビルド\\ | ||
| < | < | ||
| - | > set CPU= | + | > " |
| - | > python | + | Setting environment for using Microsoft Visual Studio 2008 x86 tools. |
| + | > set CPU=x86 | ||
| + | > py -2 build-wxpython.py | ||
| </ | </ | ||
| x64 ビルド\\ | x64 ビルド\\ | ||
| < | < | ||
| - | > set CPU=X64 | + | > " |
| - | > python | + | Setting environment for using Microsoft Visual Studio 2008 x64 tools. |
| + | > set CPU=x64 | ||
| + | > py -2 build-wxpython.py | ||
| + | </ | ||
| + | |||
| + | ==== wxPython Phoenix 4系 ==== | ||
| + | フォルダ構成を以下のようにする。\\ | ||
| + | ^ build_folder ^^ | ||
| + | | + ^ wxWidgets ^ | ||
| + | | + ^ wxPython-Phoenix ^ | ||
| + | |||
| + | < | ||
| + | > git clone https:// | ||
| + | > cd wxPython-Phoenix | ||
| + | > " | ||
| + | ********************************************************************** | ||
| + | ** Visual Studio 2019 Developer Command Prompt v16.4.5 | ||
| + | ** Copyright (c) 2019 Microsoft Corporation | ||
| + | ********************************************************************** | ||
| + | [vcvarsall.bat] Environment initialized for: ' | ||
| + | > echo %VCToolsVersion% | ||
| + | 14.16.27023 | ||
| + | > git submodule update --init --recursive | ||
| + | </ | ||
| + | |||
| + | ==== トラブルシューティング ==== | ||
| + | |||
| + | === link.EXE : return code ' | ||
| + | **vcvarsall.bat** の引数 **x86/x64** を適切に指定する。\\ | ||
| + | < | ||
| + | > " | ||
| + | Setting environment for using Microsoft Visual Studio 2008 x86 tools. | ||
| + | </ | ||
| + | or | ||
| + | < | ||
| + | > " | ||
| + | Setting environment for using Microsoft Visual Studio 2008 x64 tools. | ||
| </ | </ | ||
| - | ==== error: Microsoft Visual C++ 9.0 is required. が発生する場合 | + | === error: Microsoft Visual C++ 9.0 is required. が発生する場合 === |
| 以下のエラーが発生する場合\\ | 以下のエラーが発生する場合\\ | ||
| < | < | ||
| 行 78: | 行 143: | ||
| </ | </ | ||
| - | ==== error: Unable to find vcvarsall.bat が発生する場合 | + | === error: Unable to find vcvarsall.bat が発生する場合 === |
| 以下のエラーが発生する場合\\ | 以下のエラーが発生する場合\\ | ||
| < | < | ||
| 行 90: | 行 155: | ||
| Test\\ | Test\\ | ||
| <code pyhton> | <code pyhton> | ||
| - | > python | + | > py -2 |
| Python 2.7.17 (v2.7.17: | Python 2.7.17 (v2.7.17: | ||
| Type " | Type " | ||
| >>> | >>> | ||
| - | >>> | + | >>> |
| + | >>> | ||
| 9.0 | 9.0 | ||
| >>> | >>> | ||
| - | >>> | + | >>> |
| - | >>> | + | >>> |
| Traceback (most recent call last): | Traceback (most recent call last): | ||
| File "< | File "< | ||
| - | File "c:\python27\Lib\distutils\msvc9compiler.py", | + | File "C:\Python27\lib\distutils\msvc9compiler.py", |
| raise DistutilsPlatformError(" | raise DistutilsPlatformError(" | ||
| distutils.errors.DistutilsPlatformError: | distutils.errors.DistutilsPlatformError: | ||
| >>> | >>> | ||
| - | >>> | + | >>> |
| - | >>> | + | >>> |
| - | {u' | + | u' |
| - | + | ||
| - | | + | |
| - | + | ||
| - | | + | |
| - | + | ||
| - | | + | |
| >>> | >>> | ||
| </ | </ | ||
| 行 124: | 行 184: | ||
| [[https:// | [[https:// | ||
| - | ===== 最小のwxPythonアプリケーション ===== | + | ==== distutils.msvccompiler |
| - | [PyWxHelloMain] - UTF-8で保存すること。 | + | <WRAP prewrap 100% # |
| <code python> | <code python> | ||
| + | def get_build_version(): | ||
| + | """ | ||
| + | |||
| + | For Python 2.3 and up, the version number is included in | ||
| + | sys.version. | ||
| + | """ | ||
| + | prefix = "MSC v." | ||
| + | i = sys.version.find(prefix) | ||
| + | if i == -1: | ||
| + | return 6 | ||
| + | i = i + len(prefix) | ||
| + | s, rest = sys.version[i: | ||
| + | majorVersion = int(s[:-2]) - 6 | ||
| + | if majorVersion >= 13: | ||
| + | # v13 was skipped and should be v14 | ||
| + | majorVersion += 1 | ||
| + | minorVersion = int(s[2:3]) / 10.0 | ||
| + | # I don't think paths are affected by minor version in version 6 | ||
| + | if majorVersion == 6: | ||
| + | minorVersion = 0 | ||
| + | if majorVersion >= 6: | ||
| + | return majorVersion + minorVersion | ||
| + | # else we don't know what version of the compiler this is | ||
| + | return None | ||
| + | </ | ||
| + | </ | ||
| + | <WRAP prewrap 100% #result> | ||
| + | <code python> | ||
| + | >>> | ||
| + | >>> | ||
| + | 14.1 | ||
| + | >>> | ||
| + | >>> | ||
| + | '3.8.1 (tags/ | ||
| + | >>> | ||
| + | ' | ||
| + | >>> | ||
| + | 13 >>> | ||
| + | >>> | ||
| + | 14 | ||
| + | >>> | ||
| + | ' | ||
| + | >>> | ||
| + | >>> | ||
| + | 0.1 | ||
| + | >>> | ||
| + | 14.1 | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ==== distutils.msvc9compiler の find_vcvarsall() の実装 (Python 3.8) ==== | ||
| + | <WRAP prewrap 100% # | ||
| + | <code python> | ||
| + | def find_vcvarsall(version): | ||
| + | """ | ||
| + | |||
| + | At first it tries to find the productdir of VS 2008 in the registry. If | ||
| + | that fails it falls back to the VS90COMNTOOLS env var. | ||
| + | """ | ||
| + | vsbase = VS_BASE % version | ||
| + | try: | ||
| + | productdir = Reg.get_value(r" | ||
| + | " | ||
| + | except KeyError: | ||
| + | log.debug(" | ||
| + | productdir = None | ||
| + | |||
| + | if not productdir or not os.path.isdir(productdir): | ||
| + | toolskey = " | ||
| + | toolsdir = os.environ.get(toolskey, | ||
| + | |||
| + | if toolsdir and os.path.isdir(toolsdir): | ||
| + | productdir = os.path.join(toolsdir, | ||
| + | productdir = os.path.abspath(productdir) | ||
| + | if not os.path.isdir(productdir): | ||
| + | log.debug(" | ||
| + | return None | ||
| + | else: | ||
| + | log.debug(" | ||
| + | if not productdir: | ||
| + | log.debug(" | ||
| + | return None | ||
| + | vcvarsall = os.path.join(productdir, | ||
| + | if os.path.isfile(vcvarsall): | ||
| + | return vcvarsall | ||
| + | log.debug(" | ||
| + | return None | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ===== 最小の wxPython アプリケーション ===== | ||
| + | <wrap em>※ UTF-8 で保存すること。</ | ||
| + | |||
| + | ==== wx.Frame サンプル ==== | ||
| + | {{: | ||
| + | |||
| + | <WRAP prewrap 100% # | ||
| + | <code python PyWxHelloMain.py> | ||
| # | # | ||
| # -*- coding: utf-8 -*- | # -*- coding: utf-8 -*- | ||
| - | |||
| import wx | import wx | ||
| - | + | ||
| - | # PyWxHelloFrameクラス(wxFrameから派生) | + | # PyWxHelloFrame クラス(wxFrame から派生) |
| class PyWxHelloFrame(wx.Frame): | class PyWxHelloFrame(wx.Frame): | ||
| def __init__(self, | def __init__(self, | ||
| wx.Frame.__init__(self, | wx.Frame.__init__(self, | ||
| - | # Panel生成 | + | # Panel 生成 |
| panel = wx.Panel(self, | panel = wx.Panel(self, | ||
| - | # Panelに[閉じる]ボタンを追加 | + | # Panel に [閉じる] ボタンを追加 |
| - | btnClose = wx.Button(panel, | + | btnClose = wx.Button(panel, |
| # ボタンの位置を設定 | # ボタンの位置を設定 | ||
| - | btnClose.SetPosition((50, 35)) | + | btnClose.SetPosition((100, 35)) |
| # クリックイベントにイベントハンドラをバインド | # クリックイベントにイベントハンドラをバインド | ||
| self.Bind(wx.EVT_BUTTON, | self.Bind(wx.EVT_BUTTON, | ||
| - | + | ||
| - | # [閉じる]ボタンクリック時 | + | # [閉じる] ボタンクリック時 |
| def btnClose_Click(self, | def btnClose_Click(self, | ||
| # 閉じる | # 閉じる | ||
| self.Close(True) | self.Close(True) | ||
| - | + | ||
| - | # PyWxHelloAppクラス(wxAppから派生) | + | # PyWxHelloApp クラス(wxApp から派生) |
| class PyWxHelloApp(wx.App): | class PyWxHelloApp(wx.App): | ||
| def OnInit(self): | def OnInit(self): | ||
| - | # PyWxHelloFrameクラスを生成(タイトル、サイズを指定) | + | # PyWxHelloFrame クラスを生成(タイトル、サイズを指定) |
| - | mainFrame = PyWxHelloFrame(None, | + | mainFrame = PyWxHelloFrame(None, |
| # トップウインドウとして設定 | # トップウインドウとして設定 | ||
| self.SetTopWindow(mainFrame) | self.SetTopWindow(mainFrame) | ||
| 行 161: | 行 318: | ||
| # 正常終了 | # 正常終了 | ||
| return True | return True | ||
| + | |||
| # メイン処理 | # メイン処理 | ||
| def main(): | def main(): | ||
| - | # PyWxHelloAppクラスを生成 | + | # PyWxHelloApp クラスを生成 |
| app = PyWxHelloApp(False) | app = PyWxHelloApp(False) | ||
| # メインループを開始 | # メインループを開始 | ||
| app.MainLoop() | app.MainLoop() | ||
| + | |||
| # スクリプト起動時にmain()を実行 | # スクリプト起動時にmain()を実行 | ||
| if __name__ == " | if __name__ == " | ||
| main() | main() | ||
| </ | </ | ||
| + | </ | ||
| + | |||
| + | サンプルアプリケーションの実行。\\ | ||
| + | <WRAP prewrap 100%> | ||
| + | < | ||
| + | $ python PyWxHelloMain.py | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ==== wx.html2.WebView サンプル ==== | ||
| + | {{: | ||
| + | |||
| + | <WRAP prewrap 100% # | ||
| + | <code python PyWxWebView.py> | ||
| + | # | ||
| + | # -*- coding: utf-8 -*- | ||
| + | import wx | ||
| + | import wx.html2 | ||
| + | |||
| + | # PyWxWebViewDialog (wxDialog ) | ||
| + | class PyWxWebViewDialog(wx.Dialog): | ||
| + | def __init__(self, | ||
| + | wx.Dialog.__init__(self, | ||
| + | # BoxSizer | ||
| + | sizer = wx.BoxSizer(wx.VERTICAL) | ||
| + | # WebView | ||
| + | self.browser = wx.html2.WebView.New(self, | ||
| + | # | ||
| + | # BoxSizer | ||
| + | sizer.Add(self.browser, | ||
| + | # Dialog | ||
| + | self.SetSizer(sizer) | ||
| + | # Dialog | ||
| + | self.SetSize((1024, | ||
| + | # Dialog | ||
| + | self.SetMinSize((600, | ||
| + | # Dialog | ||
| + | self.Center() | ||
| + | |||
| + | if __name__ == ' | ||
| + | # wxApp | ||
| + | app = wx.App() | ||
| + | # PyWxWebViewDialog | ||
| + | dialog = PyWxWebViewDialog(None, | ||
| + | # WebView | ||
| + | dialog.browser.LoadURL(' | ||
| + | # Dialog | ||
| + | dialog.Show() | ||
| + | # | ||
| + | app.MainLoop() | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | サンプルアプリケーションの実行。\\ | ||
| + | <WRAP prewrap 100%> | ||
| + | < | ||
| + | $ python PyWxWebView.py</ | ||
| + | </ | ||
| + | |||
| + | ===== 技術情報 ===== | ||
| + | |||
| + | ==== WebView ==== | ||
| + | WebView は [[https:// | ||
| + | [[https:// | ||
| + | <WRAP prewrap 100% # | ||
| + | <code cpp wxWidgets\src\msw\webview_ie.cpp> | ||
| + | bool wxWebViewIE:: | ||
| + | | ||
| + | const wxString& | ||
| + | const wxPoint& | ||
| + | const wxSize& size, | ||
| + | long style, | ||
| + | const wxString& | ||
| + | { | ||
| + | if (!wxControl:: | ||
| + | | ||
| + | { | ||
| + | return false; | ||
| + | } | ||
| + | |||
| + | m_webBrowser = NULL; | ||
| + | m_isBusy = false; | ||
| + | m_historyLoadingFromList = false; | ||
| + | m_historyEnabled = true; | ||
| + | m_historyPosition = -1; | ||
| + | m_zoomType = wxWEBVIEW_ZOOM_TYPE_TEXT; | ||
| + | FindClear(); | ||
| + | |||
| + | if (:: | ||
| + | | ||
| + | | ||
| + | { | ||
| + | wxLogError(" | ||
| + | return false; | ||
| + | } | ||
| + | |||
| + | m_ie.SetDispatchPtr(m_webBrowser); | ||
| + | |||
| + | m_webBrowser-> | ||
| + | m_webBrowser-> | ||
| + | |||
| + | m_uiHandler = new DocHostUIHandler(this); | ||
| + | |||
| + | m_container = new wxIEContainer(this, | ||
| + | |||
| + | EnableControlFeature(21 /* FEATURE_DISABLE_NAVIGATION_SOUNDS */); | ||
| + | |||
| + | LoadURL(url); | ||
| + | return true; | ||
| + | } | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ===== 参考文献 ===== | ||
| + | [[https:// | ||
| + | [[http:// | ||
| + | [[https:// | ||
| + | [[https:// | ||
| + | [[https:// | ||
| + | [[https:// | ||
| + | |||
| + | ==== 付録 ==== | ||
| + | [[tw> | ||
| + | |||