Wxpython-quick-guide
wxPython-はじめに
*wxPython* は、人気のあるクロスプラットフォームGUIツールキットである *wxWidgets* (C ++で記述されています)のPythonラッパーです。 Harri PasanenとともにRobin Dunnによって開発されたwxPythonは、Python拡張モジュールとして実装されています。
wxWidgetsと同様に、wxPythonもフリーソフトウェアです。 公式Webサイトhttp://wxpython.org [[[1]]]からダウンロードできます。多くのオペレーティングシステムプラットフォームのバイナリとソースコードは、このサイトからダウンロードできます。
wxPython APIの主要モジュールにはコアモジュールが含まれています。 APIのすべてのクラスのベースである wxObject クラスで構成されます。 制御モジュールには、GUIアプリケーション開発で使用されるすべてのウィジェットが含まれています。 たとえば、wx.Button、wx.StaticText(ラベルに類似)、wx.TextCtrl(編集可能なテキストコントロール)など。
wxPython APIにはGDI(Graphics Device Interface)モジュールがあります。 これは、ウィジェットの描画に使用されるクラスのセットです。 フォント、色、ブラシなどのクラス その一部です。 すべてのコンテナウィンドウクラスは、Windowsモジュールで定義されます。
wxPythonの公式Webサイトでは、Project Phoenix – Python 3. *用のwxPythonの新しい実装もホストしています。 速度、保守性、および拡張性の改善に焦点を当てています。 プロジェクトは2012年に開始され、まだベータ段階です。
wxPython-環境
Windows
Windows OS用のビルド済みバイナリ(32ビットと64ビットの両方)は、http://www.wxpython.org/download.phpページで入手できます。 利用可能なインストーラーの最新バージョンは、http://sourceforge.net/projects/wxpython/files/wxPython/3.0.2.0/wxPython3.0-win32-3.0.2.0-py27.exe/download?use_mirror = nchc [wxPython3.0 -win32-3.0.2.0-py27.exe] 32ビットPython 2.7の場合http://sourceforge.net/projects/wxpython/files/wxPython/3.0.2.0/wxPython3.0-win64-3.0.2.0-py27.exe/download?use_mirror=nchc[wxPython3.0-win64-3.0.2.0-py27.exe](64ビットPython 2.7用)
wxPythonデモ、サンプル、およびwxWidgetsのドキュメントも同じページからダウンロードできます。
wxPython3.0-win32-docs- demos.exe
Linux
多くのLinuxディストリビューションのwxPythonバイナリは、それぞれのリポジトリにあります。 ダウンロードおよびインストールには、対応するパッケージマネージャーを使用する必要があります。 たとえば、Debian Linuxでは、次のコマンドでwxPythonをインストールできるはずです。
sudo apt-get install python-wxgtk3.0
マックOS
MacOS用のビルド済みのバイナリイメージは、公式Webサイトのダウンロードページから入手できます。
wxPython-Hello World
Hello Worldメッセージを表示するシンプルなGUIアプリケーションは、次の手順を使用して構築されます-
- wxモジュールをインポートします。
- Applicationクラスのオブジェクトを定義します。
- wx.Frameクラスのオブジェクトとしてトップレベルウィンドウを作成します。 キャプションとサイズのパラメーターはコンストラクターで指定されます。
- 他のコントロールはFrameオブジェクトに追加できますが、それらのレイアウトは管理できません。 したがって、パネルオブジェクトをフレームに配置します。
- ウィンドウ内の目的の位置に「Hello World」を表示するStaticTextオブジェクトを追加します。
- show()メソッドでフレームウィンドウをアクティブにします。
- アプリケーションオブジェクトのメインイベントループに入ります。
import wx
app = wx.App()
window = wx.Frame(None, title = "wxPython Frame", size = (300,200))
panel = wx.Panel(window)
label = wx.StaticText(panel, label = "Hello World", pos = (100,50))
window.Show(True)
app.MainLoop()
上記のコードは、次の出力を生成します-
- wxFrameオブジェクト*は、最も一般的に使用されるトップレベルウィンドウです。 * wxWindowクラス*から派生しています。 フレームは、サイズと位置をユーザーが変更できるウィンドウです。 タイトルバーとコントロールボタンがあります。 必要に応じて、メニューバー、ツールバー、ステータスバーなどの他のコンポーネントを有効にできます。 wxFrameウィンドウには、ダイアログまたは別のフレームではない任意のフレームを含めることができます。
wxPython-GUIビルダーツール
手動コーディングで見栄えの良いGUIを作成するのは面倒です。 視覚的なGUIデザイナーツールは常に便利です。 wxPythonを対象とした多くのGUI開発IDEが利用可能です。 以下はそれらのいくつかです-
wxFormBuilder
wxDesigner
wxGlade
BoaConstructor
gui2py
*wxFormBuilder* は、wxWidget GUIデザインをC++、Python、PHP、またはXML形式に変換できる、オープンソースのクロスプラットフォームWYSIWYG GUIビルダーです。 wxFormBuilderの使用法について簡単に紹介します。
まず、wxFormBuilderの最新バージョンをhttp://sourceforge.net/projects/wxformbuilder/[[[2]]]からダウンロードしてインストールする必要があります。アプリケーションを開くと、新しいプロジェクトが作成されます。中央に空白の灰色の領域が表示されます。
プロジェクトに適切な名前を付け、コード生成言語としてPythonを選択します。 これは、次の画像に示すように、オブジェクトのプロパティウィンドウで行われます-
次に、コンポーネントパレットの[フォーム]タブから[フレーム]を選択します。
[レイアウト]タブから垂直wxBoxSizerを追加します。
適切なキャプションを使用して、ボックスに必要なコントロールを追加します。 ここでは、StaticText(ラベル)、2つのTextCtrlオブジェクト(テキストボックス)、および1つのwxButtonオブジェクトが追加されます。 フレームは次の画像のように見えます-
これら3つのコントロールで展開とストレッチを有効にします。 wxButtonオブジェクトのオブジェクトプロパティで、関数findsquare()をOnButtonClickイベントに割り当てます。
プロジェクトを保存し、F8キーを押して、開発されたGUIのPythonコードを生成します。 生成されたファイルにDemo.pyという名前を付けます
実行可能なPythonスクリプトで、demo.pyをインポートし、FindSquare()関数を定義します。 アプリケーションオブジェクトを宣言し、メインイベントループを開始します。 以下は、実行可能コードです-
import wx
#import the newly created GUI file
import demo
class CalcFrame(demo.MyFrame1):
def __init__(self,parent):
demo.MyFrame1.__init__(self,parent)
def FindSquare(self,event):
num = int(self.m_textCtrl1.GetValue())
self.m_textCtrl2.SetValue (str(num*num))
app = wx.App(False)
frame = CalcFrame(None)
frame.Show(True)
#start the applications
app.MainLoop()
上記のコードは、次の出力を生成します-
wxPython-主要なクラス
元のwxWidgets(C で記述)は、巨大なクラスライブラリです。 このライブラリのGUIクラスは、wxPythonモジュールを使用してPythonに移植されます。このモジュールは、元のwxWidgetsライブラリを可能な限り近くにミラーリングしようとします。 そのため、wxPythonのwx.Frameクラスは、C バージョンのwxFrameクラスとほぼ同じように動作します。
wxObjectは、ほとんどのクラスのベースです。 wxApp(wxPythonのwx.App)のオブジェクトは、アプリケーション自体を表します。 GUIを生成した後、アプリケーションはMainLoop()メソッドによってイベントループに入ります。 次の図は、wxPythonに含まれる最も一般的に使用されるGUIクラスのクラス階層を示しています。
wxWindow Hierarchy wxGDIObject Hierarchy wxSizerhierarchy imageswarch_xxer_image/classic_hierarchy.jpg .jpg [wxButton階層]
S.N. | Classes & Description |
---|---|
1 |
wx.Frameクラスには、引数なしのデフォルトコンストラクタがあります。 |
2 |
wx.Panelクラスは通常、wxFrameオブジェクト内に配置されます。 このクラスはwxWindowクラスからも継承されます。 |
3 |
wx.StaticTextクラスオブジェクトは、このような読み取り専用テキストを保持するコントロールを提供します。 イベントを生成しないため、パッシブコントロールと呼ぶことができます。 |
4 |
wxPythonでは、wx.TextCtrlクラスのオブジェクトがこの目的を果たします。 テキストを表示および編集できるコントロールです。 |
5 |
wx.RadioButtonクラスのオブジェクトである各ボタンには、丸いボタンの横にテキストラベルが付いています。 wxPython APIもwx.RadioBoxクラスで構成されています。 そのオブジェクトは、グループに境界線とラベルを提供します。 |
6 |
チェックボックスには、小さなラベル付きの長方形のボックスが表示されます。 クリックすると、選択が行われたことを示すチェックマークが長方形の内側に表示されます。 |
7 |
wx.ComboBoxオブジェクトは、選択する項目のリストを提示します。 ドロップダウンリストまたは永続的な表示を構成できます。 wxPython APIにはwx.Choiceクラスが含まれ、そのオブジェクトはドロップダウンリストでもあり、永続的に読み取り専用です。 |
8 |
Wx.Gaugeクラスオブジェクトは垂直または水平のバーを表示し、増分量をグラフィカルに表示します。 |
9 |
wxPython APIにはwx.Sliderクラスが含まれています。 Scrollbarと同じ機能を提供します。 スライダーは、スライダー固有のwx.EVT_SLIDERイベントバインダーによるハンドルのドラッグを処理する便利な方法を提供します。 |
10 |
最上位ウィンドウのタイトルバーのすぐ下にある水平バーは、一連のメニューを表示するために予約されています。 wxPython APIのwx.MenuBarクラスのオブジェクトです。 |
11 |
wx.Toolbarオブジェクトのスタイルパラメータがwx.TB_DOCKABLEに設定されている場合、ドッキング可能になります。 フローティングツールバーは、wxPythonのAUIToolBarクラスを使用して構築することもできます。 |
12 |
Dialogクラスオブジェクトはフレームのように表示されますが、通常は親フレームの上部のポップアップウィンドウとして使用されます。 ダイアログの目的は、ユーザーからいくつかのデータを収集し、それを親フレームに送信することです。 |
13 |
wx.Notebookウィジェットは、タブ付きコントロールを提供します。 フレーム内の1つのNotebookオブジェクトには1つ以上のタブ(ページ)があり、各タブにはコントロールのレイアウトを表示するパネルがあります。 |
14 |
このクラスのオブジェクトはレイアウトマネージャーで、2つのサブウィンドウを保持します。サブウィンドウのサイズは、それらの間の境界をドラッグして動的に変更できます。 Splitterコントロールは、コントロールをサイズ変更するためにドラッグできるハンドルを提供します。 |
15 |
wxHTMLライブラリには、HTMLコンテンツを解析および表示するためのクラスが含まれています。 これは、フル機能のブラウザーを意図したものではありませんが、wx.HtmlWindowオブジェクトは汎用HTMLビューアーです。 |
16 |
wx.ListBoxウィジェットは、垂直方向にスクロール可能な文字列のリストを提示します。 デフォルトでは、リスト内の単一のアイテムが選択可能です。 ListCtrlウィジェットは、高度に強化されたリスト表示および選択ツールです。 複数の列のリストは、レポートビュー、リストビュー、またはアイコンビューで表示できます。 |
wxPython-イベント処理
順次実行されるコンソールモードアプリケーションとは異なり、GUIベースのアプリケーションはイベント駆動型です。 関数やメソッドは、ボタンをクリックする、コレクションからアイテムを選択する、マウスクリックなど、イベントと呼ばれるユーザーのアクションに応じて実行されます。
アプリケーションの実行時に発生するイベントに関連するデータは、 wx.Event から派生したサブクラスのオブジェクトとして保存されます。 表示コントロール(Buttonなど)は特定のタイプのイベントのソースであり、それに関連付けられたEventクラスのオブジェクトを生成します。 たとえば、ボタンをクリックするとwx.CommandEventが発生します。 このイベントデータは、プログラムのイベントハンドラーメソッドにディスパッチされます。 wxPythonには、多くの定義済みのイベントバインダーがあります。 *イベントバインダー*は、特定のウィジェット(コントロール)、関連するイベントタイプ、イベントハンドラーメソッド間の関係をカプセル化します。
たとえば、ボタンのクリックイベントでプログラムの* OnClick()メソッド*を呼び出すには、次のステートメントが必要です-
self.b1.Bind(EVT_BUTTON, OnClick)
- Bind()メソッド*は、wx.EvtHandlerクラスのすべての表示オブジェクトに継承されます。 EVT_.BUTTONは、ボタンクリックイベントをOnClick()メソッドに関連付けるバインダーです。
例
次の例では、最上位ウィンドウ(この場合はwx.Frameオブジェクト)のドラッグによって発生したMoveEventは、wx.EVT_MOVEバインダーを使用して* OnMove()メソッド*に接続されます。 コードはウィンドウを表示します。 マウスを使用して移動すると、その瞬間の座標がコンソールに表示されます。
import wx
class Example(wx.Frame):
def __init__(self, *args, **kw):
super(Example, self).__init__(*args, **kw)
self.InitUI()
def InitUI(self):
self.Bind(wx.EVT_MOVE, self.OnMove)
self.SetSize((250, 180))
self.SetTitle('Move event')
self.Centre()
self.Show(True)
def OnMove(self, e):
x, y = e.GetPosition()
print "current window position x = ",x," y= ",y
ex = wx.App()
Example(None)
ex.MainLoop()
上記のコードは、次の出力を生成します-
現在のウィンドウ位置x = 562 y = 309
現在のウィンドウ位置x = 562 y = 309
現在のウィンドウ位置x = 326 y = 304
現在のウィンドウ位置x = 384 y = 240
現在のウィンドウ位置x = 173 y = 408
現在のウィンドウ位置x = 226 y = 30
現在のウィンドウ位置x = 481 y = 80
wx.Eventから継承されたサブクラスのいくつかは、次の表に記載されています-
以下は、wx.Eventの最も一般的に使用されるイベントです。
S.N. | Events & Description |
---|---|
1 |
wxKeyEvent キーが押されるか離されると発生します |
2 |
wxPaintEvent ウィンドウのコンテンツを再描画する必要があるたびに生成されます |
3 |
wxMouseEvent マウスボタンが押された、またはドラッグされたなどのマウスアクティビティによるイベントに関するデータが含まれます |
4 |
wxScrollEvent wxScrollbarやwxSliderなどのスクロール可能なコントロールに関連付けられています |
5 |
wxCommandEvent ボタン、ダイアログ、クリップボードなど、多くのウィジェットから発生したイベントデータが含まれます。 |
6 |
wxMenuEvent メニューコマンドボタンのクリックを除く、さまざまなメニュー関連イベント |
7 |
wxColourPickerEvent wxColourPickerCtrlが生成したイベント |
8 |
wxDirFilePickerEvent FileDialogおよびDirDialogによって生成されるイベント |
wxPythonのイベントには2つのタイプがあります。 基本イベントとコマンドイベント。 基本的なイベントは、元のウィンドウのローカルに留まります。 ほとんどのwxWidgetsはコマンドイベントを生成します。 *コマンドイベント*は、クラス階層のソースウィンドウの上にあるウィンドウに伝播できます。
例
以下は、イベント伝播の簡単な例です。 完全なコードは-
import wx
class MyPanel(wx.Panel):
def __init__(self, parent):
super(MyPanel, self).__init__(parent)
b = wx.Button(self, label = 'Btn', pos = (100,100))
b.Bind(wx.EVT_BUTTON, self.btnclk)
self.Bind(wx.EVT_BUTTON, self.OnButtonClicked)
def OnButtonClicked(self, e):
print 'Panel received click event. propagated to Frame class'
e.Skip()
def btnclk(self,e):
print "Button received click event. propagated to Panel class"
e.Skip()
class Example(wx.Frame):
def __init__(self,parent):
super(Example, self).__init__(parent)
self.InitUI()
def InitUI(self):
mpnl = MyPanel(self)
self.Bind(wx.EVT_BUTTON, self.OnButtonClicked)
self.SetTitle('Event propagation demo')
self.Centre()
self.Show(True)
def OnButtonClicked(self, e):
print 'click event received by frame class'
e.Skip()
ex = wx.App()
Example(None)
ex.MainLoop()
上記のコードには、2つのクラスがあります。 MyPanel 、wx.PanelサブクラスおよびExample、プログラムのトップレベルウィンドウであるwx.Frameサブクラス。 パネルにボタンが配置されます。
このButtonオブジェクトは、親クラス(この場合はMyPanel)に伝達するイベントハンドラbtnclk()にバインドされています。 ボタンをクリックすると、 CommandEvent が生成されます。これは、Skip()メソッドによって親に伝搬できます。
MyPanelクラスオブジェクトは、受信したイベントを別のハンドラーOnButtonClicked()にバインドします。 この関数は、その親であるExampleクラスに順番に送信します。 上記のコードは、次の出力を生成します-
Button received click event. Propagated to Panel class.
Panel received click event. Propagated to Frame class.
Click event received by frame class.
wxPython-レイアウト管理
GUIウィジェットは、ピクセル単位で測定される絶対座標を指定することにより、コンテナウィンドウ内に配置できます。 座標は、コンストラクターのsize引数で定義されたウィンドウの次元に相対的です。 ウィンドウ内のウィジェットの位置は、コンストラクターの pos 引数によって定義されます。
import wx
app = wx.App()
window = wx.Frame(None, title = "wxPython Frame", size = (300,200))
panel = wx.Panel(window)
label = wx.StaticText(panel, label = "Hello World", pos = (100,50))
window.Show(True)
app.MainLoop()
ただし、この*絶対位置*は、次の理由により適切ではありません-
- ウィンドウのサイズを変更しても、ウィジェットの位置は変わりません。
- 解像度が異なるディスプレイデバイスでは、外観が均一でない場合があります。
- フォーム全体の再設計が必要になる可能性があるため、レイアウトの変更は困難です。
wxPython APIは、コンテナ内のウィジェットの配置をよりエレガントに管理するためのレイアウトクラスを提供します。 絶対配置に対するレイアウトマネージャーの利点は次のとおりです-
- ウィンドウ内のウィジェットは自動的にサイズ変更されます。
- 異なる解像度のディスプレイデバイスで均一な外観を保証します。
- 再設計することなく、ウィジェットを動的に追加または削除できます。
レイアウトマネージャーは、wxPythonではSizerと呼ばれます。 Wx.Sizerは、すべてのサイザーサブクラスの基本クラスです。 wx.BoxSizer、wx.StaticBoxSizer、wx.GridSizer、wx.FlexGridSizer、wx.GridBagSizerなどの重要なサイザーのいくつかについて説明しましょう。
S.N. | Sizers & Description |
---|---|
1 |
このサイザーにより、コントロールを行方向または列方向に配置できます。 BoxSizerのレイアウトは、向きの引数(wxVERTICALまたはwxHORIZONTALのいずれか)によって決定されます。 |
2 |
名前が示すように、GridSizerオブジェクトは2次元グリッドを表します。 コントロールは、左から右、上から下の順にグリッドスロットに追加されます。 |
3 |
このサイザーには2次元のグリッドもあります。 ただし、セル内のコントロールのレイアウトには柔軟性がほとんどありません。 |
4 |
GridBagSizerは汎用性の高いサイザーです。 FlexiGridSizerよりも多くの拡張機能を提供します。 子ウィジェットは、グリッド内の特定のセルに追加できます。 |
5 |
StaticBoxSizerは、ボックスサイザーを静的ボックスに配置します。 上部にラベルとともにボックスの周りに境界線を提供します。 |
wxPython-ボタン
ボタンウィジェットは、GUIインターフェイスで最も広く使用されています。 ユーザーが生成したクリックイベントをキャプチャします。 その最も明白な使用法は、それにバインドされたハンドラー関数をトリガーすることです。
wxPythonクラスライブラリは、さまざまな種類のボタンを提供します。 シンプルで伝統的なボタン、 wx.Button クラスオブジェクトがあり、キャプションとしてテキストが含まれています。 wx.ToggleButton という名前の2つの状態のボタンも使用できます。 押された状態または押された状態は、eventhandler関数によって識別できます。
別のタイプのボタン wx.BitmapButton は、ビットマップ(画像)をアイコンとして顔に表示します。
wx.Buttonクラスとwx.ToggleButtonクラスのコンストラクタは、次の引数を取ります-
Wx.Button(parent, id, label, pos, size, style)
これらは、wx.Buttonクラスの重要なメソッドです-
S.N. | Methods & Description |
---|---|
1 |
SetLabel() ボタンのキャプションをプログラムで設定します |
2 |
GetLabel() ボタンのキャプションを返します |
3 |
SetDefault() ボタンはトップレベルウィンドウのデフォルトに設定されています。 Enterキーを押すとクリックイベントをエミュレートします |
wx.ToggleButtonクラスの2つの重要なメソッドは-
S.N. | Methods & Description |
---|---|
1 |
GetValue() トグルボタンの状態を返します(オン/オフ) |
2 |
SetValue() プログラムでボタンの状態を設定します |
ビットマップボタンを作成するには、まず、ビットマップオブジェクトをイメージファイルから構築する必要があります。
wx.Bitmapクラスコンストラクタの次のバリエーションは、最も一般的に使用されています-
Wx.Bitmap(fiiename, wx.BITMAP_TYPE)
定義済みのビットマップ型定数のいくつかは-
wx.BITMAP_TYPE_BMP | wx.BITMAP_TYPE_ICO | wx.BITMAP_TYPE_CUR | wx.BITMAP_TYPE_TIFF | wx.BITMAP_TYPE_TIF | wx.BITMAP_TYPE_GIF | wx.BITMAP_TYPE_PNG | wx.BITMAP_TYPE_JPEG | wx.BITMAP_TYPE_PCX | wx.BITMAP_TYPE_ICON | wx.BITMAP_TYPE_ANY |
このビットマップオブジェクトは、wx.BitmapButtonクラスコンストラクターのパラメーターの1つとして使用されます。
Wx.BitmapButton(parent, id, bitmap, pos, size, style)
一部のOSプラットフォームでは、ビットマップボタンはビットマップとラベルの両方を表示できます。 SetLabel()メソッドはキャプションを割り当てます。 他のプラットフォームでは、内部ラベルとして機能します。
通常のボタンとビットマップボタンは、wx.CommandEventを発行します。 EVT_BUTTONバインダーは、ハンドラー関数をそれに関連付けます。
一方、トグルボタンは、イベント処理にwx.TOGGLEBUTTONバインダーを使用します。
次の例では、3つのタイプすべてのボタンがパネルの垂直ボックスサイザーに配置されています。
シンプルなボタンオブジェクトは、ステートメントを使用して作成されます-
self.btn = wx.Button(panel, -1, "click Me")
トグルボタンは次のステートメントで構成されています-
self.tbtn = wx.ToggleButton(panel , -1, "click to on")
これらのボタンは、次のステートメントを使用して垂直サイザーに追加されます-
vbox.Add(self.btn,0,wx.ALIGN_CENTER)
vbox.Add(self.tbtn,0,wx.EXPAND|wx.ALIGN_CENTER)
注意-wx.EXPANDフラグのため、トグルボタンはフレームの幅全体を占めます。
EVT_BUTTONおよびEVT_TOGGLEBUTTONバインダーを使用して、それぞれのハンドラーに関連付けられます。
self.btn.Bind(wx.EVT_BUTTON,self.OnClicked)
self.tbtn.Bind(wx.EVT_TOGGLEBUTTON,self.OnToggle)
3つのビットマップボタンが水平ボックスサイザーに追加されます。 これらのボタンは、キャプションとしてアイコンとして画像を表示します。
bmp = wx.Bitmap("NEW.BMP", wx.BITMAP_TYPE_BMP)
self.bmpbtn = wx.BitmapButton(panel, id = wx.ID_ANY, bitmap = bmp,
size = (bmp.GetWidth()+10, bmp.GetHeight()+10))
bmp1 = wx.Bitmap("OPEN.BMP", wx.BITMAP_TYPE_BMP)
self.bmpbtn1 = wx.BitmapButton(panel, id = wx.ID_ANY, bitmap = bmp1,
size = (bmp.GetWidth()+10, bmp.GetHeight()+10))
bmp2 = wx.Bitmap("SAVE.BMP", wx.BITMAP_TYPE_BMP)
self.bmpbtn2 = wx.BitmapButton(panel, id = wx.ID_ANY, bitmap = bmp2,
size = (bmp.GetWidth()+10, bmp.GetHeight()+10))
これら3つのボタンのクリックイベントは、OnClicked()メソッドに送られます。
self.bmpbtn.Bind(wx.EVT_BUTTON, self.OnClicked)
self.bmpbtn1.Bind(wx.EVT_BUTTON, self.OnClicked)
self.bmpbtn2.Bind(wx.EVT_BUTTON, self.OnClicked)
これらのボタンの内部ラベルは、それぞれNEW、OPEN、SAVEに設定されています。
OnClicked()イベントハンドラー関数は、クリックイベントの原因となったソースボタンのラベルを取得します。 そのラベルはコンソールに印刷されています。
def OnClicked(self, event):
btn = event.GetEventObject().GetLabel()
print "Label of pressed button = ",btn
OnToggle()イベントハンドラーは、トグルボタンがクリックされるとトリガーされます。 その状態はGetValue()メソッドによって読み取られ、それに応じてボタンのキャプションが設定されます。
def OnToggle(self,event):
state = event.GetEventObject().GetValue()
if state == True:
print "off"
event.GetEventObject().SetLabel("click to off")
else:
print "on"
event.GetEventObject().SetLabel("click to on")
完全なコードリストは次のとおりです-
import wx
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title,size = (200,150))
panel = wx.Panel(self)
vbox = wx.BoxSizer(wx.VERTICAL)
self.btn = wx.Button(panel,-1,"click Me")
vbox.Add(self.btn,0,wx.ALIGN_CENTER)
self.btn.Bind(wx.EVT_BUTTON,self.OnClicked)
self.tbtn = wx.ToggleButton(panel , -1, "click to on")
vbox.Add(self.tbtn,0,wx.EXPAND|wx.ALIGN_CENTER)
self.tbtn.Bind(wx.EVT_TOGGLEBUTTON,self.OnToggle)
hbox = wx.BoxSizer(wx.HORIZONTAL)
bmp = wx.Bitmap("NEW.BMP", wx.BITMAP_TYPE_BMP)
self.bmpbtn = wx.BitmapButton(panel, id = wx.ID_ANY, bitmap = bmp,
size = (bmp.GetWidth()+10, bmp.GetHeight()+10))
hbox.Add(self.bmpbtn,0,wx.ALIGN_CENTER)
self.bmpbtn.Bind(wx.EVT_BUTTON,self.OnClicked)
self.bmpbtn.SetLabel("NEW")
bmp1 = wx.Bitmap("OPEN.BMP", wx.BITMAP_TYPE_BMP)
self.bmpbtn1 = wx.BitmapButton(panel, id = wx.ID_ANY, bitmap = bmp1,
size = (bmp.GetWidth()+10, bmp.GetHeight()+10))
hbox.Add(self.bmpbtn1,0,wx.ALIGN_CENTER)
self.bmpbtn1.Bind(wx.EVT_BUTTON,self.OnClicked)
self.bmpbtn1.SetLabel("OPEN")
bmp2 = wx.Bitmap("SAVE.BMP", wx.BITMAP_TYPE_BMP)
self.bmpbtn2 = wx.BitmapButton(panel, id = wx.ID_ANY, bitmap = bmp2,
size = (bmp.GetWidth()+10, bmp.GetHeight()+10))
hbox.Add(self.bmpbtn2,0,wx.ALIGN_CENTER)
self.bmpbtn2.Bind(wx.EVT_BUTTON,self.OnClicked)
self.bmpbtn2.SetLabel("SAVE")
vbox.Add(hbox,1,wx.ALIGN_CENTER)
panel.SetSizer(vbox)
self.Centre()
self.Show()
self.Fit()
def OnClicked(self, event):
btn = event.GetEventObject().GetLabel()
print "Label of pressed button = ",btn
def OnToggle(self,event):
state = event.GetEventObject().GetValue()
if state == True:
print "Toggle button state off"
event.GetEventObject().SetLabel("click to off")
else:
print " Toggle button state on"
event.GetEventObject().SetLabel("click to on")
app = wx.App()
Mywin(None, 'Button demo')
app.MainLoop()
上記のコードは、次の出力を生成します-
押されたボタンのラベル=クリックミー
トグルボタンの状態をオフにする
ボタンの状態をオンに切り替えます
押されたボタンのラベル= NEW
押されたボタンのラベル= OPEN
押されたボタンのラベル= SAVE
wxPython-ドッキング可能なウィンドウ
*wxAui* は、wxWidgets APIに組み込まれた高度なユーザーインターフェイスライブラリです。 Wx.aui.AuiManager AUIフレームワークの中心クラス。
*AuiManager* は、wx.aui.AuiPanelInfoオブジェクト内の各パネルの情報を使用して、特定のフレームに関連付けられたペインを管理します。 PanelInfoオブジェクトコントロールのドッキングとフローティング動作のさまざまなプロパティについて学びましょう。
トップレベルのフレームにドッキング可能なウィンドウを配置するには、次の手順が含まれます-
まず、AuiManagerオブジェクトを作成します。
self.mgr = wx.aui.AuiManager(self)
次に、必要なコントロールを備えたパネルを設計します。
pnl = wx.Panel(self)
pbox = wx.BoxSizer(wx.HORIZONTAL)
text1 = wx.TextCtrl(pnl, -1, "Dockable", style = wx.NO_BORDER | wx.TE_MULTILINE)
pbox.Add(text1, 1, flag = wx.EXPAND)
pnl.SetSizer(pbox)
AuiPanelInfoの以下のパラメーターが設定されます。
- 方向-上、下、左、右、または中央
- 位置-ドッキング可能領域内に複数のペインを配置できます。 それぞれに位置番号が与えられます。
- 行-1行に複数のペインが表示されます。 同じ行に複数のツールバーが表示されるように。
- レイヤー-ペインをレイヤーに配置できます。
このPanelInfoを使用して、設計されたパネルがマネージャーオブジェクトに追加されます。
info1 = wx.aui.AuiPaneInfo().Bottom()
self.mgr.AddPane(pnl,info1)
トップレベルウィンドウの残りの部分には、通常どおり他のコントロールがあります。
完全なコードは次のとおりです-
import wx
import wx.aui
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title, size = (300,300))
self.mgr = wx.aui.AuiManager(self)
pnl = wx.Panel(self)
pbox = wx.BoxSizer(wx.HORIZONTAL)
text1 = wx.TextCtrl(pnl, -1, "Dockable", style = wx.NO_BORDER | wx.TE_MULTILINE)
pbox.Add(text1, 1, flag = wx.EXPAND)
pnl.SetSizer(pbox)
info1 = wx.aui.AuiPaneInfo().Bottom()
self.mgr.AddPane(pnl, info1)
panel = wx.Panel(self)
text2 = wx.TextCtrl(panel, size = (300,200), style = wx.NO_BORDER | wx.TE_MULTILINE)
box = wx.BoxSizer(wx.HORIZONTAL)
box.Add(text2, 1, flag = wx.EXPAND)
panel.SetSizerAndFit(box)
self.mgr.Update()
self.Bind(wx.EVT_CLOSE, self.OnClose)
self.Centre()
self.Show(True)
def OnClose(self, event):
self.mgr.UnInit()
self.Destroy()
app = wx.App()
Mywin(None,"Dock Demo")
app.MainLoop()
上記のコードは、次の出力を生成します-
wxPython-複数ドキュメントインターフェイス
典型的なGUIアプリケーションには複数のウィンドウがあります。 タブ付きウィジェットとスタック済みウィジェットを使用すると、そのようなウィンドウを一度に1つアクティブにできます。 ただし、多くの場合、このアプローチは他のウィンドウの表示が非表示になるため、役に立たない場合があります。
複数のウィンドウを同時に表示する1つの方法は、それらを独立したウィンドウとして作成することです。 これはSDI( Single Document Interface )と呼ばれます。 各ウィンドウには独自のメニューシステム、ツールバーなどがあるため、これにはより多くのメモリリソースが必要です。
wxPythonのMDIフレームワークは、wx.MDIParentFrameクラスを提供します。 そのオブジェクトは、それぞれがwx.MDIChildFrameクラスのオブジェクトである複数の子ウィンドウのコンテナとして機能します。
子ウィンドウは、親フレームのMDIClientWindow領域にあります。 子フレームが追加されるとすぐに、親フレームのメニューバーに、カスケードまたはタイル状に子を配置するボタンを含むウィンドウメニューが表示されます。
例
次の例は、MDIParentFrameをトップレベルウィンドウとして使用する方法を示しています。 NewWindowというメニューボタンは、クライアント領域に子ウィンドウを追加します。 複数のウィンドウを追加して、カスケードまたはタイル順に並べることができます。
完全なコードは次のとおりです-
import wx
class MDIFrame(wx.MDIParentFrame):
def __init__(self):
wx.MDIParentFrame.__init__(self, None, -1, "MDI Parent", size = (600,400))
menu = wx.Menu()
menu.Append(5000, "&New Window")
menu.Append(5001, "&Exit")
menubar = wx.MenuBar()
menubar.Append(menu, "&File")
self.SetMenuBar(menubar)
self.Bind(wx.EVT_MENU, self.OnNewWindow, id = 5000)
self.Bind(wx.EVT_MENU, self.OnExit, id = 5001)
def OnExit(self, evt):
self.Close(True)
def OnNewWindow(self, evt):
win = wx.MDIChildFrame(self, -1, "Child Window")
win.Show(True)
app = wx.App()
frame = MDIFrame()
frame.Show()
app.MainLoop()
上記のコードは、次の出力を生成します-
wxPython-描画API
*GDI* + (Graphics Drawing Interface)、 *CoreGraphics* 、および* Cairoライブラリ*は、wxPythonの描画APIのフレームワークを形成します。 wx.GraphicsContextは主要な描画可能オブジェクトであり、これを使用してさまざまなデバイスコンテキストオブジェクトが作成されます。
wx.DCは抽象クラスです。 その派生クラスは、さまざまなデバイスでグラフィックとテキストをレンダリングするために使用されます。 デバイスコンテキストクラスは-
- wx.ScreenDC -これを使用して、個々のウィンドウではなく、画面にペイントします。
- wx.ClientDC -これを使用してウィンドウのクライアント領域(境界線やその他の装飾のない部分)にペイントしますが、wxPaintEvent内からは使用しないでください。
- wx.PaintDC -これを使用して、ウィンドウのクライアント領域にペイントしますが、wxPaintEvent内からのみです。
- wx.WindowDC -これを使用して、装飾を含むウィンドウの領域全体にペイントします。 これは、Windows以外のプラットフォームでは利用できない場合があります。
wxPythonの描画APIは、形状、テキスト、画像を描画するためのさまざまな機能を提供します。 色、ペン、ブラシ、フォントなど、描画に必要なオブジェクトもGDIクラスを使用して構築できます。
wx.Colourクラス
Colorオブジェクトは、RGB(赤、緑、青)の強度値の組み合わせを表し、それぞれ0〜255のスケールです。 いくつかの定義済みの色オブジェクトがあります-
- wxBLACK
- wxBLUE
- wxCYAN
- wxGREEN
- wxYELLOW
- wxLIGHT_GREY
- wxRED
- wxWHITE
RGB値のカスタムの組み合わせを持つ色は、* wx.Colourオブジェクト*として形成されます。
wx.Colour(r,g,b)
wx.Penクラス
ペンオブジェクトは、線、長方形、円などのグラフィックスの形状の色、幅、スタイルを決定します。
- 事前定義されたペンオブジェクト*は-
wxBLACK_DASHED_PEN | wxBLACK_PEN | wxBLUE_PEN | wxCYAN_PEN | wxGREEN_PEN | wxYELLOW_PEN | wxGREY_PEN | wxLIGHT_GREY_PEN | wxMEDIUM_GREY_PEN | wxRED_PEN | wxTRANSPARENT_PEN | wxWHITE_PEN |
- 事前定義されたペンスタイル*は-
wx.SOLID | wx.DOT | wx.LONG_DASH | wx.SHORT_DASH | wx.DOT_DASH | wx.TRANSPARENT |
wx.Brushクラス
ブラシは、長方形、楕円、円などの形状の背景を塗りつぶすために必要な別の基本的なグラフィックスオブジェクトです。
カスタムBrushオブジェクトには、wx.ColourおよびBrushスタイルパラメーターが必要です。 以下は、事前定義されたブラシスタイルのリストです-
wx.SOLID | wx.STIPPLE | wx.BDIAGONAL_HATCH | wx.CROSSDIAG_HATCH | wx.FDIAGONAL_HATCH | wx.CROSS_HATCH | wx.HORIZONTAL_HATCH | wx.VERTICAL_HATCH | wx.TRANSPARENT |
wxPythonには、さまざまな形状、テキスト、画像の描画を容易にする多数の機能があります。
S.N. | Functions & Description |
---|---|
1 |
DrawRectangle() 指定された寸法の長方形を描画します |
2 |
DrawCircle() 中心と半径として指定された点に円を描きます |
3 |
DrawEllipse() 指定されたx半径とy半径で楕円を描画します |
4 |
DrawLine() 2つのwx.Pointオブジェクトの間に線を描画します |
5 |
DrawBitmap() 指定された位置に画像を描画します |
6 |
DrawText() 指定したテキストを指定した位置に表示します |
例
上記の関数は、Pen、Brush、Color、およびFontオブジェクトを使用して、次の例で実装されます。
完全なコードは次のとおりです-
import wx
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title,size = (500,300))
self.InitUI()
def InitUI(self):
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Centre()
self.Show(True)
def OnPaint(self, e):
dc = wx.PaintDC(self)
brush = wx.Brush("white")
dc.SetBackground(brush)
dc.Clear()
dc.DrawBitmap(wx.Bitmap("python.jpg"),10,10,True)
color = wx.Colour(255,0,0)
b = wx.Brush(color)
dc.SetBrush(b)
dc.DrawCircle(300,125,50)
dc.SetBrush(wx.Brush(wx.Colour(255,255,255)))
dc.DrawCircle(300,125,30)
font = wx.Font(18, wx.ROMAN, wx.ITALIC, wx.NORMAL)
dc.SetFont(font)
dc.DrawText("Hello wxPython",200,10)
pen = wx.Pen(wx.Colour(0,0,255))
dc.SetPen(pen)
dc.DrawLine(200,50,350,50)
dc.SetBrush(wx.Brush(wx.Colour(0,255,0), wx.CROSS_HATCH))
dc.DrawRectangle(380, 15, 90, 60)
ex = wx.App()
Mywin(None,'Drawing demo')
ex.MainLoop()
上記のコードは、次の出力を生成します-
wxPython-ドラッグアンドドロップ
- ドラッグ&ドロップ*の提供は、ユーザーにとって非常に直感的です。 ユーザーがオブジェクトをマウスでドラッグして別のウィンドウにドロップするだけで、あるウィンドウから別のウィンドウにオブジェクトをコピーまたは移動できる多くのデスクトップアプリケーションで見られます。
ドラッグアンドドロップ操作には、次の手順が含まれます-
- ドロップターゲットを宣言する
- データオブジェクトを作成する
- wx.DropSourceを作成する
- ドラッグ操作を実行
- ドロップをキャンセルまたは受け入れる
wxPythonでは、2つの事前定義されたドロップターゲットがあります-
- wx.TextDropTarget
- wx.FileDropTarget
多くのwxPythonウィジェットは、ドラッグアンドドロップアクティビティをサポートしています。 ソースコントロールではドラッグを有効にする必要がありますが、ターゲットコントロールはドラッグを受け入れる(または拒否する)位置になければなりません。
ユーザーがドラッグしているソースデータは、ターゲットオブジェクトに配置されます。 ターゲットオブジェクトのOnDropText()はデータを消費します。 必要に応じて、ソースオブジェクトのデータを削除できます。
例
次の例では、2つのListCrlオブジェクトがBox Sizerに水平に配置されています。 左側のリストには、languages []データが入力されています。 ドラッグのソースとして指定されています。 右側の1つがターゲットです。
languages = ['C', 'C++', 'Java', 'Python', 'Perl', 'JavaScript', 'PHP', 'VB.NET','C#']
self.lst1 = wx.ListCtrl(panel, -1, style = wx.LC_LIST)
self.lst2 = wx.ListCtrl(panel, -1, style = wx.LC_LIST)
for lang in languages:
self.lst1.InsertStringItem(0,lang)
2番目のリストコントロールは空で、TextDropTargetクラスのオブジェクトの引数です。
class MyTextDropTarget(wx.TextDropTarget):
def __init__(self, object):
wx.TextDropTarget.__init__(self)
self.object = object
def OnDropText(self, x, y, data):
self.object.InsertStringItem(0, data)
OnDropText()メソッドは、ターゲットリストコントロールにソースデータを追加します。
ドラッグ操作は、イベントバインダーによって初期化されます。
wx.EVT_LIST_BEGIN_DRAG(self, self.lst1.GetId(), self.OnDragInit)
OnDragInit()関数は、ドラッグデータをターゲットに配置し、ソースから削除します。
def OnDragInit(self, event):
text = self.lst1.GetItemText(event.GetIndex())
tobj = wx.PyTextDataObject(text)
src = wx.DropSource(self.lst1)
src.SetData(tobj)
src.DoDragDrop(True)
self.lst1.DeleteItem(event.GetIndex())
完全なコードは次のとおりです-
import wx
class MyTarget(wx.TextDropTarget):
def __init__(self, object):
wx.TextDropTarget.__init__(self)
self.object = object
def OnDropText(self, x, y, data):
self.object.InsertStringItem(0, data)
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title,size = (-1,300))
panel = wx.Panel(self)
box = wx.BoxSizer(wx.HORIZONTAL)
languages = ['C', 'C++', 'Java', 'Python', 'Perl', 'JavaScript',
'PHP', 'VB.NET','C#']
self.lst1 = wx.ListCtrl(panel, -1, style = wx.LC_LIST)
self.lst2 = wx.ListCtrl(panel, -1, style = wx.LC_LIST)
for lang in languages:
self.lst1.InsertStringItem(0,lang)
dt = MyTarget(self.lst2)
self.lst2.SetDropTarget(dt)
wx.EVT_LIST_BEGIN_DRAG(self, self.lst1.GetId(), self.OnDragInit)
box.Add(self.lst1,0,wx.EXPAND)
box.Add(self.lst2, 1, wx.EXPAND)
panel.SetSizer(box)
panel.Fit()
self.Centre()
self.Show(True)
def OnDragInit(self, event):
text = self.lst1.GetItemText(event.GetIndex())
tobj = wx.PyTextDataObject(text)
src = wx.DropSource(self.lst1)
src.SetData(tobj)
src.DoDragDrop(True)
self.lst1.DeleteItem(event.GetIndex())
ex = wx.App()
Mywin(None,'Drag&Drop Demo')
ex.MainLoop()
上記のコードは、次の出力を生成します-