フォーラム | 最新のWeb開発のチュートリアル
 

wxPythonクイックガイド



wxPythonを - はじめに

wxPythonのためのPythonラッパーであるwxWidgets (which is written in C++) 、人気のクロスプラットフォームGUIツールキット。 ハッリ・パサネンと共にロビンダンによって開発された、wxPythonのは、Python拡張モジュールとして実装されます。

ただ、wxWidgetsのように、wxPythonのは、フリーソフトウェアです。 これは、公式サイトからダウンロードすることができhttp://wxpython.org。 多くのオペレーティング・システム・プラットフォームのためのバイナリとソースコードは、このサイトからダウンロードできます。

wxPythonのAPIの主なモジュールは、コアモジュールが含まれます。 これは、で構成されていwxObject APIのすべてのクラスの基底クラスです。 制御モジュールは、GUIアプリケーションの開発に使用されるすべてのウィジェットが含まれています。 例えば、wx.Button、wx.StaticText (analogous to a label) 、wx.TextCtrl (editable text control) 、等

wxPythonのAPIは、GDI有する(Graphics Device Interface)モジュール。 これは、ウィジェット上で描画するために使用するクラスのセットです。 など、フォント、色、ブラシ、などのクラスは、それの一部です。 すべてのコンテナウィンドウクラスは、Windowsのモジュールで定義されています。

wxPythonの公式ウェブサイトでは、プロジェクトフェニックスをホストする - Pythonの3のためのwxPythonの新しい実装を*。 それはスピード、保守性、および拡張性を向上させることに焦点を当てています。 このプロジェクトは2012年に始まり、ベータ版の段階にとどまっています。


wxPythonを - 環境


ウィンドウズ

WindowsのOS用のビルド済みのバイナリ(both 32 bit and 64 bit)で利用可能なhttp://www.wxpython.org/download.phpのページ。 利用可能なインストーラの最新バージョンがある- wxPython3.0-win32-3.0.2.0-py27.exe 32ビットのPython 2.7 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

MacOSの

ディスクイメージの形でMacOSのためのビルド済みのバイナリは、公式サイトのダウンロードページで入手できます。


wxPythonの - のHello World

Hello Worldのメッセージを表示するシンプルなGUIアプリケーションは、次の手順を使用して構築されています -

  • インポートWXモジュール。

  • Applicationクラスのオブジェクトを定義します。

  • wx.Frameクラスのオブジェクトとしてトップレベルウィンドウを作成します。 キャプションとサイズのパラメータは、コンストラクタで与えられています。

  • 他のコントロールは、Frameオブジェクトに追加することができますが、そのレイアウトを管理することができません。 したがって、フレームの中にPanelオブジェクトを置きます。

  • ウィンドウ内の所望の位置に「Hello Worldの」を表示するには、スタティックオブジェクトを追加します。

  • フレームウィンドウをアクティブshow()メソッド。

  • Applicationオブジェクトのメインイベントループを入力します。

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 object最も一般的に用いられているトップレベルウィンドウです。 これは、から派生しwxWindow class 。 フレームは、その大きさや位置、ユーザによって変更することができるウィンドウです。 これは、タイトルバーとコントロールボタンがあります。 必要な場合は、メニューバー、ツールバー、ステータスバーなどの他のコンポーネントを有効にすることができます。 wxFrameウィンドウはダイアログまたは別のフレームではない任意のフレームを含めることができます。


wxPythonの - GUIビルダーツール

手動コーディングで格好良いGUIを作成すると、面倒なことができます。 視覚的なGUIデザイナツールは、常に便利です。 wxPythonのをターゲットに多くのGUI開発のIDEが用意されています。 以下のうちの一部です -

  • wxFormBuilder
  • wxDesigner
  • wxGlade
  • ボアコンストラクター
  • gui2py

wxFormBuilder &プラス;,パイソン、PHPまたはXML形式; C&プラスにwxWidget GUIデザインを変換することができるオープンソース、クロスプラットフォームのWYSIWYG GUIビルダーです。 wxFormBuilderの使用方法を簡単に紹介をここに与えられています。

wxFormBuilderのすべての最新バージョンの最初からダウンロードしてインストールする必要がありますhttp://sourceforge.net/projects/wxformbuilder/。 アプリケーションを開くには、中央に空白の灰色の領域での新しいプロジェクトが表示されます。

プロジェクトに適切な名前を付けて、コード生成言語としてPythonを選択してください。 次の画像に示すように、これはオブジェクトのプロパティウィンドウで行われます -

オブジェクトのプロパティ

次に、コンポーネントパレットの「フォーム」タブからフレームを選択します。

フレームを選択します。

「レイアウト」タブから垂直wxBoxSizerを追加します。

wxBoxSizerを追加

適したキャプションをボックスに必要なコントロールを追加します。 ここで、スタティック(label)二TextCtrlオブジェクト(text boxes)とwxButtonオブジェクトが追加されます。 フレームには、以下の画像のように見えます -

コントロールを追加します

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

3つのコントロール

開発したGUI用のPythonコードを生成するためのプロジェクトを押しF8キーを保存します。 生成されたファイルはDemo.pyという名前が付けられてみよう

実行可能なPythonスクリプトで、インポートdemo.pyと定義FindSquare()関数。 Applicationオブジェクトを宣言し、メインイベントループを開始します。 以下は、実行可能コードです -

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 (written in C++) 、巨大なクラスライブラリです。 このライブラリーからGUIクラスができるだけ近く元wxWidgetsのライブラリを反映しようとwxPythonのモジュールとのPythonに移植されています。 だから、wxPythonの中wx.Frameクラスは、C ++のバージョンでwxFrameクラスと同じように多くを動作します。

wxObjectは、クラスのほとんどのための基本です。 wxAppのオブジェクト(wx.App in wxPython)アプリケーション自体を表します。 GUIを生成した後、アプリケーションは、によってイベントループに入るMainLoop()メソッド。 以下の図は、wxPythonの中に含まれる最も一般的に使用されるGUIクラスのクラス階層を示しています。

wxWindow階層wxGDIObject階層wxSizer階層wxButton階層
SN クラス&説明
1 wx.Frame

wx.Frameクラスは、引数なしのデフォルトコンストラクタを持っています。

2 wx.Panel

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

3 wx.StaticText

wx.StaticTextクラスオブジェクトは、読み取り専用のテキストを保持制御を提供します。 それはすべてのイベントを生成しませんので、それは受動的な制御と呼ぶことができます。

4 TextCtrl

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

5 ラジオボタン&ラジオボックス

各ボタンは、wx.RadioButtonクラスのオブジェクトは、丸いボタンの横のテキストラベルを運びます。 wxPythonのAPIはまたwx.RadioBoxクラスで構成されています。 その目的はグループにボーダーとラベルを提供しています。

6 wx.CheckBox

チェックボックスが小さい標識長方形のボックスが表示されます。 クリックすると、チェックマークが選択がなされていることを示すために長方形の内側に表示されます。

7 コンボボックス&Choiceのクラス

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

8 Wx.Gauge

Wx.Gaugeクラスオブジェクトは、グラフィカル量をインクリメント示す垂直または水平バーを示しています。

9 wx.Slider

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

10 wx.MenuBar

ただ、トップレベルウィンドウのタイトルバーの下の横棒は、一連のメニューを表示するために予約されています。 これはwxPythonのAPIのwx.MenuBarクラスのオブジェクトです。

11 wx.Toolbar

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

12 Wx.Dialog

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

13 wx.Notebook

wx.Notebookウィジェットは、タブコントロールを提示します。 フレーム内の一つのノートブックオブジェクトは、1つ以上のタブ有し(called Pages) 、それらの各々は、コントロールのレイアウトを示すパネルを有します。

14 wx.SplitterWindow

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

15 HTMLWindow

wxHTMLライブラリは、HTMLコンテンツを解析して表示するためのクラスが含まれています。 これはフル機能のブラウザであることを意図していないものの、wx.HtmlWindowオブジェクトは、一般的なHTMLビューアです。

16 リストボックス&ListCtrl

wx.ListBoxウィジェットは、文字列の縦方向にスクロール可能なリストを提示します。 デフォルトでは、リスト内の単一の項目が選択可能です。 ListCtrlウィジェットは非常に強化され、一覧表示や選択ツールです。 複数の列のリストは、レポートビュー、リストビューまたはアイコンビューで表示することができます。


wxPythonを - イベント処理

順次実行されるコンソール・モード・アプリケーションとは異なり、GUIベースのアプリケーションはイベント駆動型です。 関数やメソッドは、イベントと呼ばれる、などのコレクションやマウスクリック、から項目を選択し、ボタンをクリックするなどのユーザーのアクションに応じて実行されています。

アプリケーションの実行時に行われたイベントに関連するデータが由来サブクラスのオブジェクトとして格納されてwx.Event 。 表示制御(such as Button) 、特定のタイプのイベントのソースであり、それに関連するイベントクラスのオブジェクトを生成します。 例えば、ボタンのクリックはwx.CommandEventを発します。 このイベントデータは、プログラム内のイベントハンドラメソッドにディスパッチされます。 wxPythonのは、多くのあらかじめ定義されたイベントのバインダーを持っています。 Event binder特定のウィジェットの間の関係をカプセル化(control) 、その関連イベントタイプ、イベントハンドラメソッド。

たとえば、呼び出すためOnClick()ボタンのクリックイベントにプログラムする方法を、次のステートメントが必要です-

self.b1.Bind(EVT_BUTTON, OnClick)

Bind() method wx.EvtHandlerクラスからの全ての表示オブジェクトに継承されます。 EVT_.BUTTONはここにあるボタンのクリックイベントに関連付けバインダー、あるOnClick()メソッドを。


次の例では、トップレベルウィンドウドラッグによって引き起こさMoveEvent、 -この場合wx.Frameオブジェクトが-に接続されているOnMove() wx.EVT_MOVEバインダーを用いる方法。 コードウィンドウを表示します。 それは、マウスを使って移動した場合は、その瞬間の座標がコンソールに表示されます。

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から継承されたサブクラスのいくつかは、次の表に記載されています -

SN イベント&説明
1

wxKeyEvent

キーが押すか、解放されたときに発生します

2

wxPaintEvent

ウィンドウの内容を再描画する必要があるたびに生成されます

3

wxMouseEvent

マウスボタンが押されたり、ドラッグのような原因マウス操作にすべてのイベントに関するデータが含まれています

4

wxScrollEvent

wxScrollbarとwxSliderなどのスクロール可能なコントロールに関連付けられています

5

wxCommandEvent

などのボタン、ダイアログ、クリップボード、できるだけ多くのウィジェットから発信イベントデータが含まれています

6

wxMenuEvent

メニューコマンドボタンのクリックを除く異なるメニュー関連のイベント

7

wxColourPickerEvent

wxColourPickerCtrlは、イベントを生成しました

8

wxDirFilePickerEvent

FileDialogとDirDialogによって生成されたイベント

wxPythonの中のイベントは2つのタイプがあります。 基本的なイベントおよびコマンドイベント。 基本的なイベントは、それが発信されているウィンドウにローカルなままです。 wxWidgetsののほとんどは、コマンドイベントを発生させます。 command eventクラス階層内のソースウィンドウ上である、窓や窓に伝播することができます。


以下は、イベント伝播の簡単な例です。 完全なコードがあります -

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サブクラスおよび実施例は、プログラムのトップレベルウィンドウであるwx.Frameサブクラス。 ボタンはパネル内に配置されます。

このButtonオブジェクトは、イベントハンドラにバインドされているbtnclk()親クラスにそれを伝播する(MyPanel in this case) ボタンのクリックが発生CommandEventによりその親に伝播することができますSkip()メソッドを。

MyPanelクラスオブジェクトは、別のハンドラに受信したイベントをバインドOnButtonClicked() 順番にこの関数は、その親、例のクラスを送信します。 上記のコードは、次の出力を生成します -

イベント処理の出力

Button received click event. Propagated to Panel class. 
Panel received click event. Propagated to Frame class. 
Click event received by frame class.

wxPythonを - レイアウト管理

GUIウィジェットは、ピクセル単位の絶対座標を指定することにより、コンテナウィンドウの内側に配置することができます。 座標は、コンストラクタのサイズ引数で定義されたウィンドウの大きさに対するものです。 ウィンドウ内のウィジェットの位置は以下のように定義され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()

このAbsolute Positioningしかし、以下の理由により適していません-

  • ウィジェットの位置は、ウィンドウのサイズが変更された場合でも変わりません。

  • 外観は、異なる解像度の異なる表示装置上に均一でなくてもよいです。

  • それはフォーム全体を設計し直す必要があるかもしれないようなレイアウトでの変更は困難です。

wxPythonのAPIは、コンテナ内のウィジェットの配置のよりエレガントな管理のためのレイアウトクラスを提供します。 絶対位置上のレイアウトマネージャの利点があります -

  • ウィンドウ内のウィジェットは自動的にリサイズされます。
  • 異なる解像度を持つディスプレイデバイス上で均一な外観を保証します。
  • ウィジェットを追加または削除すると、動的に再設計することなく可能です。

レイアウトマネージャはwxPythonの中サイザーと呼ばれています。 Wx.Sizerはすべてサイザーサブクラスの基本クラスです。 私たちは、このようなwx.BoxSizer、wx.StaticBoxSizer、wx.GridSizer、wx.FlexGridSizer、およびwx.GridBagSizerなどの重要なサイザーのいくつかを説明しましょう。

SN サイザー&解説
1 BoxSizer

この寸法測定器は、コントロールは、行方向または列方向の様式で配置されることを可能にします。 BoxSizerのレイアウトは、その向き引数によって決定されます(either wxVERTICAL or wxHORIZONTAL)

2 GridSizer

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

3 FlexiGridSizer

このサイザーはまた、2次元のグリッドを持っています。 しかし、それは細胞内のコントロールのレイアウトに少しより多くの柔軟性を提供します。

4 GridBagSizer

GridBagSizerは万能サイザーです。 それはFlexiGridSizerよりも強化されています。 子ウィジェットは、グリッド内の特定の細胞に添加することができます。

5 StaticBoxSizer

StaticBoxSizerは、静的な箱の中に箱サイザーを置きます。 これは、上部のラベルと一緒に箱の周囲に境界線を提供します。


wxPythonを - ボタン

ボタンウィジェットは任意のGUIインターフェイスで最も広く使用されています。 これは、ユーザーによって生成されたクリックイベントをキャプチャします。 その最も明白な使用は、それに結合されたハンドラ関数をトリガすることです。

wxPythonのクラスライブラリは、ボタンの種類を提供します。 シンプルで伝統的なボタン、ありwx.Buttonキャプションなど、いくつかのテキストを運ぶクラスオブジェクトは、。 二状態ボタンがと命名され、また利用可能であるwx.ToggleButton 。 その押されたか、うつ状態は、EventHandlerの機能によって識別することができます。

ボタンの別の種類、 wx.BitmapButtonビットマップ表示(image)その面にアイコンとして。

wx.Buttonクラスとwx.ToggleButtonクラスのコンストラクタは、次の引数を取ります -

Wx.Button(parent, id, label, pos, size, style)

これらはwx.Buttonクラスのいくつかの重要な方法であります -

SN メソッドと説明
1

SetLabel()

プログラムでボタンのキャプションを設定します。

2

GetLabel()

ボタンのキャプションを返します。

3

SetDefault()

ボタンはトップレベルウィンドウのデフォルトに設定されています。 Enterキーを押すと上のクリックイベントをエミュレートします

wx.ToggleButtonクラスの二つの重要な方法があります -

SN メソッドと説明
1

GetValue()

トグルボタンの状態を返します(on/off)

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)

Note - wx.EXPANDフラグ、トグルボタンがフレームの幅全体を占有するので。

彼らはそれぞれのハンドラに関連付けられているEVT_BUTTONとEVT_TOGGLEBUTTONバインダーを使用しました。

self.btn.Bind(wx.EVT_BUTTON,self.OnClicked) 
self.tbtn.Bind(wx.EVT_TOGGLEBUTTON,self.OnToggle)

三つのビットマップボタンが水平ボックスサイザーに追加されます。 これらのボタンは、彼らのキャプションとしてのアイコンなどの画像を表示します。

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

これらの三つのボタンのクリックイベントが対象とする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に組み込まれた高度なユーザーインターフェイスライブラリです。 AUIの枠組みの中で中心的クラスWx.aui.AuiManager。

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の次のパラメータが設定されています。

  • Direction -上、下、左、右、またはセンター

  • Position - 1つのペインよりもはドッキング可能な領域内に配置することができます。 それぞれは、位置番号が与えられます。

  • Row -複数のペインには、1行に表示されます。 ただ、同じ行に表示されて複数のツールバーが好きです。

  • Layer -ペインは、レイヤーに配置することができます。

この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つの、このようなウィンドウをアクティブにすることができます。 他のウィンドウのビューが隠されているようしかし、何度もこのアプローチは有用ではないかもしれません。

同時に複数のウィンドウを表示するための一つの方法は、独立したウィンドウとしてそれらを作成することです。 これは、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 libraries wxPythonのにAPIを描くフレームワークを形成します。 wx.GraphicsContextは、様々なデバイスコンテキストオブジェクトが作成された使用、プライマリ描画可能なオブジェクトです。

wx.DCは抽象クラスです。 その派生クラスは、異なるデバイス上のグラフィックスとテキストのレンダリングに使用されています。 デバイスコンテキストクラスがあります -

  • wx.ScreenDC -個々の窓とは反対に、画面上にペイントするために使用します。

  • wx.ClientDC -ウィンドウのクライアント領域にペイントするために使用します(the part without borders and other decorations)が、wxPaintEvent内からそれを使用しないでください。

  • wx.PaintDC -しかし、ウィンドウのクライアント領域にペイントするために使用しますonly wxPaintEvent内から。

  • wx.WindowDC -装飾を含め、窓の全領域をペイントするために使用します。 これは、Windows以外のプラットフォーム上で利用できない場合があります。

wxPythonのの描画APIは、形状、テキストや画像を描画するためのさまざまな機能を提供しています。 色、ペン、ブラシやフォントなどの目的を描画するために必要なオブジェクトは、また、GDIクラスを使用して構築することができます。


wx.Colourクラス

カラーオブジェクトは、RGBの組み合わせを表し(RED, Green and Blue)の強度値、0〜255のスケールでそれぞれ。 以下のようないくつかの定義済みの色のオブジェクトがあります -

  • wxBLACK
  • wxBLUE
  • wxCYAN
  • wxGREEN
  • wxYELLOW
  • wxLIGHT_GREY
  • wxRED
  • wxWHITE

RGB値のカスタムの組み合わせで色は以下のように形成されwx.Colour object 。

wx.Colour(r,g,b)

wx.Penクラス

ペンオブジェクトは、線、矩形、円などのようなグラフィックスの形状の色、幅、およびスタイルを決定します

Predefined Pen objectsあります-

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

Predefined Pen stylesあります-

wx.SOLID
wx.DOT
wx.LONG_DASH
wx.SHORT_DASH
wx.DOT_DASH
wx.TRANSPARENT

wx.Brushクラス

ブラシなど矩形、楕円、円などの図形の背景を埋めるために必要な他の基本グラフィックオブジェクトであります

カスタムブラシオブジェクトは、wx.Colourとブラシスタイルパラメータが必要です。 以下は、定義済みブラシスタイルのリストです -

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のは、異なる形状の描画、テキストおよび画像を容易に多数の機能を有しています。

SN 機能と説明
1

DrawRectangle()

所定の大きさの長方形を描きます

2

DrawCircle()

中心と半径と所定の時点で円を描きます

3

DrawEllipse()

与えられたxとyの半径と楕円を描きます

4

DrawLine()

2つのwx.Pointオブジェクトbeween線を描画します

5

DrawBitmap()

所定の位置に画像を描画します

6

DrawText()

指定された位置に指定したテキストを表示します

上記の機能は、ペン、ブラシ、色、フォントオブジェクトを利用して、以下の実施例において実現されます。

次のように完全なコードがあります -

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を - ドラッグ&ドロップ

提供drag and drop 、ユーザーにとって非常に直感的です。 これは、ユーザーがマウスだけでそれをドラッグして別のウィンドウにドロップすることにより、別のウィンドウからオブジェクトをコピーまたは移動することができ、多くのデスクトップアプリケーションに含まれています。

ドラッグ&ドロップ操作は、次の手順が必要 -

  • ドロップターゲットを宣言
  • データオブジェクトを作成します。
  • wx.DropSourceを作成します。
  • ドラッグ操作を実行します
  • キャンセルするか、ドロップを受け入れます

wxPythonのでは、2つの定義済みのドロップターゲットがあります -

  • wx.TextDropTarget
  • wx.FileDropTarget

多くのwxPythonのウィジェットは、ドラッグ&ドロップの活動をサポートしています。 ソースコントロールは、ターゲットコントロールが受け入れる位置になければならないのに対し、有効をドラッグしている必要があります(or reject)ドラッグを。

ユーザーがドラッグされたソースデータは、対象物の上に置かれています。 OnDropText()ターゲットオブジェクトのデータを消費します。 所望であれば、ソース・オブジェクトからデータを削除することができます。


以下の例では、2つのListCrlオブジェクトはボックスサイザーに水平に配置されています。 左側の一覧は言語[]のデータが取り込まれます。 これは、ドラッグのソースとして指定されています。 右の一つは、ターゲットです。

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

The above code produces the following output −

ドラッグドロップアウトプット