Python入門から応用までの学習サイト


Button

wxPythonにおける最も基本的な部品の一つであるButtonの紹介です。様々なイベントの起点となる部品でもあるので、是非覚えておきましょう。

パネルへボタンを追加しています。初期化時の引数には(親ウィンドウ、識別子、ラベル)の順番で渡しています。

# -*- coding: utf-8 -*- 

import wx

application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, u"テストフレーム", size=(300,200))

panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour("#AFAFAF")

button_1 = wx.Button(panel, wx.ID_ANY, u"ボタン1")
button_2 = wx.Button(panel, wx.ID_ANY, u"ボタン2")
button_3 = wx.Button(panel, wx.ID_ANY, u"ボタン3")

layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(button_1)
layout.Add(button_2)
layout.Add(button_3)

panel.SetSizer(layout)

frame.Show()
application.MainLoop()

--実行結果--

wxPython_button_01



先程のサンプルでは初期化時にラベル(ボタンに表示される文字)を指定していました。もちろんラベルを変更するメソッドも用意されています。

# -*- coding: utf-8 -*- 

import wx

application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, u"テストフレーム", size=(300,200))

panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour("#AFAFAF")

button_1 = wx.Button(panel, wx.ID_ANY, u"ボタン1")
button_2 = wx.Button(panel, wx.ID_ANY, u"ボタン2")
button_3 = wx.Button(panel, wx.ID_ANY, u"ボタン3")

button_3.SetLabel(u"Button3")

layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(button_1)
layout.Add(button_2)
layout.Add(button_3)

panel.SetSizer(layout)

frame.Show()
application.MainLoop()

--実行結果--

button_3のラベルが「ボタン3」ではなく「Button3」となりました。

wxPython_button_02



ボタンのサイズを変更するには初期化時に「size」を渡します。それ以外にも「SetSize」「SetMaxSize」「SetMinSize」でも設定可能ですが、Sizerの設定に依存する場合もあるので注意しましょう。

# -*- coding: utf-8 -*- 

import wx

application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, u"テストフレーム", size=(300,200))

panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour("#AFAFAF")

button_1 = wx.Button(panel, wx.ID_ANY, u"ボタン1")
button_2 = wx.Button(panel, wx.ID_ANY, u"ボタン2")
button_3 = wx.Button(panel, wx.ID_ANY, u"ボタン3", size=(50,50))
button_4 = wx.Button(panel, wx.ID_ANY, u"ボタン4")

#button_3.SetSize((50, 50))
#button_3.SetMaxSize((50, 50))
#button_3.SetMinSize((50, 50))

layout = wx.GridSizer(2, 2)
layout.Add(button_1)
layout.Add(button_2)
layout.Add(button_3)
layout.Add(button_4)

panel.SetSizer(layout)

frame.Show()
application.MainLoop()

--実行結果--

サイズ変更をした「ボタン3」のみ大きさが違います。

wxPython_button_03



ボタンのフォント(文字の大きさや太字設定)を変更するには「SetFont」を使用します。16行目にて使用するFontクラスを初期化しています。

# -*- coding: utf-8 -*- 

import wx

application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, u"テストフレーム", size=(300,200))

panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour("#AFAFAF")

button_1 = wx.Button(panel, wx.ID_ANY, u"ボタン1")
button_2 = wx.Button(panel, wx.ID_ANY, u"ボタン2")
button_3 = wx.Button(panel, wx.ID_ANY, u"ボタン3")
button_4 = wx.Button(panel, wx.ID_ANY, u"ボタン4")

font = wx.Font(20, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL)
button_3.SetFont(font)

layout = wx.GridSizer(2, 2)
layout.Add(button_1, 0, wx.GROW)
layout.Add(button_2, 0, wx.GROW)
layout.Add(button_3, 0, wx.GROW)
layout.Add(button_4, 0, wx.GROW)

panel.SetSizer(layout)

frame.Show()
application.MainLoop()

--実行結果--

「ボタン3」の文字の大きさを変更しました。

wxPython_button_0



ボタンの文字色の変更には「SetForegroundColour」を使用します。サンプルでは赤へ変更しています。

# -*- coding: utf-8 -*- 

import wx

application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, u"テストフレーム", size=(300,200))

panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour("#AFAFAF")

button_1 = wx.Button(panel, wx.ID_ANY, u"ボタン1")
button_2 = wx.Button(panel, wx.ID_ANY, u"ボタン2")
button_3 = wx.Button(panel, wx.ID_ANY, u"ボタン3")
button_4 = wx.Button(panel, wx.ID_ANY, u"ボタン4")

button_3.SetForegroundColour("#FF0000")

layout = wx.GridSizer(2, 2)
layout.Add(button_1, 0, wx.GROW)
layout.Add(button_2, 0, wx.GROW)
layout.Add(button_3, 0, wx.GROW)
layout.Add(button_4, 0, wx.GROW)

panel.SetSizer(layout)

frame.Show()
application.MainLoop()

--実行結果--

「ボタン3」文字色を赤へ変更しました。

wxPython_button_05



ボタンの背景色の変更は「SetBackgroundColour」を使用します。サンプルでは青へ変更しています。

# -*- coding: utf-8 -*- 

import wx

application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, u"テストフレーム", size=(300,200))

panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour("#AFAFAF")

button_1 = wx.Button(panel, wx.ID_ANY, u"ボタン1")
button_2 = wx.Button(panel, wx.ID_ANY, u"ボタン2")
button_3 = wx.Button(panel, wx.ID_ANY, u"ボタン3")
button_4 = wx.Button(panel, wx.ID_ANY, u"ボタン4")

button_3.SetBackgroundColour("#0000FF")

layout = wx.GridSizer(2, 2)
layout.Add(button_1, 0, wx.GROW)
layout.Add(button_2, 0, wx.GROW)
layout.Add(button_3, 0, wx.GROW)
layout.Add(button_4, 0, wx.GROW)

panel.SetSizer(layout)

frame.Show()
application.MainLoop()

--実行結果--

「ボタン3」背景色を青へ変更しました。

wxPython_button_06



ボタンを無効(押せない状態)にするには「Disable」を使用します。 それとは逆に無効状態となっているボタンを有効(押せる状態)へ変更するには「Enable」を使用しましょう。

# -*- coding: utf-8 -*- 

import wx

application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, u"テストフレーム", size=(300,200))

panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour("#AFAFAF")

button_1 = wx.Button(panel, wx.ID_ANY, u"ボタン1")
button_2 = wx.Button(panel, wx.ID_ANY, u"ボタン2")
button_3 = wx.Button(panel, wx.ID_ANY, u"ボタン3")
button_4 = wx.Button(panel, wx.ID_ANY, u"ボタン4")

button_3.Disable()
#button_3.Enable()

layout = wx.GridSizer(2, 2)
layout.Add(button_1, 0, wx.GROW)
layout.Add(button_2, 0, wx.GROW)
layout.Add(button_3, 0, wx.GROW)
layout.Add(button_4, 0, wx.GROW)

panel.SetSizer(layout)

frame.Show()
application.MainLoop()

--実行結果--

「ボタン3」が押せない状態となっています。

wxPython_button_07



ボタンへツールチップ(補足情報を載せる小さいウィンドウ)を表示させるには「SetToolTipString」を使用します。

# -*- coding: utf-8 -*- 

import wx

application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, u"テストフレーム", size=(300,200))

panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour("#AFAFAF")

button_1 = wx.Button(panel, wx.ID_ANY, u"ボタン1")
button_2 = wx.Button(panel, wx.ID_ANY, u"ボタン2")
button_3 = wx.Button(panel, wx.ID_ANY, u"ボタン3")
button_4 = wx.Button(panel, wx.ID_ANY, u"ボタン4")

button_3.SetToolTipString("python-izm.com")

layout = wx.GridSizer(2, 2)
layout.Add(button_1, 0, wx.GROW)
layout.Add(button_2, 0, wx.GROW)
layout.Add(button_3, 0, wx.GROW)
layout.Add(button_4, 0, wx.GROW)

panel.SetSizer(layout)

frame.Show()
application.MainLoop()

--実行結果--

「ボタン3」の上にマウスカーソルを載せると、メッセージが出るようになります。

wxPython_button_08



ボタンを非表示にするには「Hide」を使用しましょう。 非表示状態のボタンを表示させるには「Show」を用います。 なおボタンは「見えない」だけで本体は存在しています。 非表示状態のボタンに対してラベル設定をしたりする事も可能です。

# -*- coding: utf-8 -*- 

import wx

application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, u"テストフレーム", size=(300,200))

panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour("#AFAFAF")

button_1 = wx.Button(panel, wx.ID_ANY, u"ボタン1")
button_2 = wx.Button(panel, wx.ID_ANY, u"ボタン2")
button_3 = wx.Button(panel, wx.ID_ANY, u"ボタン3")
button_4 = wx.Button(panel, wx.ID_ANY, u"ボタン4")

button_3.Hide()
#button_3.Show()

layout = wx.GridSizer(2, 2)
layout.Add(button_1, 0, wx.GROW)
layout.Add(button_2, 0, wx.GROW)
layout.Add(button_3, 0, wx.GROW)
layout.Add(button_4, 0, wx.GROW)

panel.SetSizer(layout)

frame.Show()
application.MainLoop()

--実行結果--

「ボタン3」が隠れています。見えないだけなのでプログラム上で操作してもエラーとはなりません。

wxPython_button_09



ボタンへイベントを設定するには「Bind」を使用します。 引数には(イベント種別、イベント発生時に呼び出す関数)の順番で値を渡し、「ボタン1」と「ボタン2」ではそれぞれ違う関数を定義してイベント設定しています。 「ボタン3」と「ボタン4」では、引数に「イベント発生元」を追加し、ボタン初期化時のIDで判別して挙動を変えています。 なおサンプルでもあるように、ボタン・フレームのどちらにBindしてもイベントはきちんと動作します。

# -*- coding: utf-8 -*- 

import wx


def click_button_1(event):
    frame.SetStatusText("Click! button_1")

def click_button_2(event):
    frame.SetStatusText("Click! button_2")

def click_button(event):
    if event.GetId() == 3333:
        frame.SetStatusText("Click! button_3")
    elif event.GetId() == 4444:
        frame.SetStatusText("Click! button_4")


application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, u"テストフレーム", size=(300,200))
frame.CreateStatusBar()

panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour("#AFAFAF")

button_1 = wx.Button(panel, wx.ID_ANY, u"ボタン1")
button_2 = wx.Button(panel, wx.ID_ANY, u"ボタン2")
button_3 = wx.Button(panel, 3333, u"ボタン3")
button_4 = wx.Button(panel, 4444, u"ボタン4")

button_1.Bind(wx.EVT_BUTTON, click_button_1)
button_2.Bind(wx.EVT_BUTTON, click_button_2)
frame.Bind(wx.EVT_BUTTON, click_button, button_3)
frame.Bind(wx.EVT_BUTTON, click_button, button_4)

layout = wx.GridSizer(2, 2)
layout.Add(button_1, 0, wx.GROW)
layout.Add(button_2, 0, wx.GROW)
layout.Add(button_3, 0, wx.GROW)
layout.Add(button_4, 0, wx.GROW)

panel.SetSizer(layout)

frame.Show()
application.MainLoop()

--実行結果--

ボタンを押すと、ステータスバーにそれぞれ違ったメッセージが入ります。

wxPython_button_10




Python
スタートブック


入門 Python 3


Effective
Python


退屈なことは
Pythonにやらせよう

 
 
 

こちらもGUIアプリケーションには欠かせません!

▶GUI:StaticText



確かな力が身につく
Python「超」入門




P  R