Wxpython-quick-guide

提供:Dev Guides
移動先:案内検索

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()

上記のコードは、次の出力を生成します-

Hello World

  • 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を追加します。

Add wxBoxSizer

適切なキャプションを使用して、ボックスに必要なコントロールを追加します。 ここでは、StaticText(ラベル)、2つのTextCtrlオブジェクト(テキストボックス)、および1つのwxButtonオブジェクトが追加されます。 フレームは次の画像のように見えます-

コントロールの追加

これら3つのコントロールで展開とストレッチを有効にします。 wxButtonオブジェクトのオブジェクトプロパティで、関数findsquare()をOnButtonClickイベントに割り当てます。

3つのコントロール

プロジェクトを保存し、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()

上記のコードは、次の出力を生成します-

GUIビルダー出力

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

wx.Frameクラスには、引数なしのデフォルトコンストラクタがあります。

2

wx.Panel

wx.Panelクラスは通常、wxFrameオブジェクト内に配置されます。 このクラスはwxWindowクラスからも継承されます。

3

wx.StaticText

wx.StaticTextクラスオブジェクトは、このような読み取り専用テキストを保持するコントロールを提供します。 イベントを生成しないため、パッシブコントロールと呼ぶことができます。

4

TextCtrl

wxPythonでは、wx.TextCtrlクラスのオブジェクトがこの目的を果たします。 テキストを表示および編集できるコントロールです。

5

RadioButton & RadioBox

wx.RadioButtonクラスのオブジェクトである各ボタンには、丸いボタンの横にテキストラベルが付いています。 wxPython APIもwx.RadioBoxクラスで構成されています。 そのオブジェクトは、グループに境界線とラベルを提供します。

6

wx.CheckBox

チェックボックスには、小さなラベル付きの長方形のボックスが表示されます。 クリックすると、選択が行われたことを示すチェックマークが長方形の内側に表示されます。

7

ComboBox & Choice Class

wx.ComboBoxオブジェクトは、選択する項目のリストを提示します。 ドロップダウンリストまたは永続的な表示を構成できます。 wxPython APIにはwx.Choiceクラスが含まれ、そのオブジェクトはドロップダウンリストでもあり、永続的に読み取り専用です。

8

Wx.Gauge

Wx.Gaugeクラスオブジェクトは垂直または水平のバーを表示し、増分量をグラフィカルに表示します。

9

wx.Slider

wxPython APIにはwx.Sliderクラスが含まれています。 Scrollbarと同じ機能を提供します。 スライダーは、スライダー固有のwx.EVT_SLIDERイベントバインダーによるハンドルのドラッグを処理する便利な方法を提供します。

10

wx.MenuBar

最上位ウィンドウのタイトルバーのすぐ下にある水平バーは、一連のメニューを表示するために予約されています。 wxPython APIのwx.MenuBarクラスのオブジェクトです。

11

wx.Toolbar

wx.Toolbarオブジェクトのスタイルパラメータがwx.TB_DOCKABLEに設定されている場合、ドッキング可能になります。 フローティングツールバーは、wxPythonのAUIToolBarクラスを使用して構築することもできます。

12

Wx.Dialog

Dialogクラスオブジェクトはフレームのように表示されますが、通常は親フレームの上部のポップアップウィンドウとして使用されます。 ダイアログの目的は、ユーザーからいくつかのデータを収集し、それを親フレームに送信することです。

13

wx.Notebook

wx.Notebookウィジェットは、タブ付きコントロールを提供します。 フレーム内の1つのNotebookオブジェクトには1つ以上のタブ(ページ)があり、各タブにはコントロールのレイアウトを表示するパネルがあります。

14

wx.SplitterWindow

このクラスのオブジェクトはレイアウトマネージャーで、2つのサブウィンドウを保持します。サブウィンドウのサイズは、それらの間の境界をドラッグして動的に変更できます。 Splitterコントロールは、コントロールをサイズ変更するためにドラッグできるハンドルを提供します。

15

HTMLWindow

wxHTMLライブラリには、HTMLコンテンツを解析および表示するためのクラスが含まれています。 これは、フル機能のブラウザーを意図したものではありませんが、wx.HtmlWindowオブジェクトは汎用HTMLビューアーです。

16

ListBox & ListCtrl

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

このサイザーにより、コントロールを行方向または列方向に配置できます。 BoxSizerのレイアウトは、向きの引数(wxVERTICALまたはwxHORIZONTALのいずれか)によって決定されます。

2

GridSizer

名前が示すように、GridSizerオブジェクトは2次元グリッドを表します。 コントロールは、左から右、上から下の順にグリッドスロットに追加されます。

3

FlexiGridSizer

このサイザーには2次元のグリッドもあります。 ただし、セル内のコントロールのレイアウトには柔軟性がほとんどありません。

4

GridBagSizer

GridBagSizerは汎用性の高いサイザーです。 FlexiGridSizerよりも多くの拡張機能を提供します。 子ウィジェットは、グリッド内の特定のセルに追加できます。

5

StaticBoxSizer

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()

上記のコードは、次の出力を生成します-

Dock Demo

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()

上記のコードは、次の出力を生成します-

MDI出力

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()

上記のコードは、次の出力を生成します-

ドラッグドロップ出力