TextCtrl
テキスト値の入力を行う事が出来るTextCtrlの解説です。 入力値がユーザー任せとなるため、正しい設定・きちんとしたエラー処理が必須となりますが、その分自由度が高いです。
パネルへテキストコントロールを追加しています。引数には(親ウィンドウ、識別子)の順番で渡していますが、追加で初期値を設定する事も可能です(14行目)。
# -*- 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")
text_1 = wx.TextCtrl(panel, wx.ID_ANY)
text_2 = wx.TextCtrl(panel, wx.ID_ANY)
text_3 = wx.TextCtrl(panel, wx.ID_ANY)
text_4 = wx.TextCtrl(panel, wx.ID_ANY, u"初期値")
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(text_1, flag=wx.GROW)
layout.Add(text_2, flag=wx.GROW)
layout.Add(text_3, flag=wx.GROW)
layout.Add(text_4, flag=wx.GROW)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
--実行結果--

テキストコントロールのフォント(文字の大きさや太字設定)を変更するには「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")
text_1 = wx.TextCtrl(panel, wx.ID_ANY)
text_2 = wx.TextCtrl(panel, wx.ID_ANY)
text_3 = wx.TextCtrl(panel, wx.ID_ANY, u"デフォルト")
text_4 = wx.TextCtrl(panel, wx.ID_ANY, u"カスタム")
font = wx.Font(20, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL)
text_4.SetFont(font)
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(text_1, flag=wx.GROW)
layout.Add(text_2, flag=wx.GROW)
layout.Add(text_3, flag=wx.GROW)
layout.Add(text_4, flag=wx.GROW)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
--実行結果--
text_4の文字の大きさを変更しました。

テキストコントロールの文字色の変更には「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")
text_1 = wx.TextCtrl(panel, wx.ID_ANY)
text_2 = wx.TextCtrl(panel, wx.ID_ANY)
text_3 = wx.TextCtrl(panel, wx.ID_ANY, u"デフォルト")
text_4 = wx.TextCtrl(panel, wx.ID_ANY, u"カスタム")
text_4.SetForegroundColour("#FF0000")
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(text_1, flag=wx.GROW)
layout.Add(text_2, flag=wx.GROW)
layout.Add(text_3, flag=wx.GROW)
layout.Add(text_4, flag=wx.GROW)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
--実行結果--
text_4の文字色を赤へ変更しました。

背景色の変更は「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")
text_1 = wx.TextCtrl(panel, wx.ID_ANY)
text_2 = wx.TextCtrl(panel, wx.ID_ANY)
text_3 = wx.TextCtrl(panel, wx.ID_ANY, u"デフォルト")
text_4 = wx.TextCtrl(panel, wx.ID_ANY, u"カスタム")
text_4.SetBackgroundColour("#0000FF")
text_4.SetForegroundColour("#FFFFFF")
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(text_1, flag=wx.GROW)
layout.Add(text_2, flag=wx.GROW)
layout.Add(text_3, flag=wx.GROW)
layout.Add(text_4, flag=wx.GROW)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
--実行結果--
text_4の背景色を青へ変更しました。

テキストコントロールを無効(入力出来ない状態)にするには「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")
text_1 = wx.TextCtrl(panel, wx.ID_ANY)
text_2 = wx.TextCtrl(panel, wx.ID_ANY)
text_3 = wx.TextCtrl(panel, wx.ID_ANY, u"デフォルト")
text_4 = wx.TextCtrl(panel, wx.ID_ANY, u"カスタム")
text_4.Disable()
#text_4.Enable()
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(text_1, flag=wx.GROW)
layout.Add(text_2, flag=wx.GROW)
layout.Add(text_3, flag=wx.GROW)
layout.Add(text_4, flag=wx.GROW)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
--実行結果--
text_4が入力出来ない状態となっています。

テキスト値の左寄せ・右寄せ・中央寄せを設定するには、styleに「TE_LEFT」「TE_CENTER」「TE_RIGHT」を指定します。
# -*- 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")
text_1 = wx.TextCtrl(panel, wx.ID_ANY)
text_2 = wx.TextCtrl(panel, wx.ID_ANY, u"左寄せ", style=wx.TE_LEFT)
text_3 = wx.TextCtrl(panel, wx.ID_ANY, u"中央寄せ", style=wx.TE_CENTER)
text_4 = wx.TextCtrl(panel, wx.ID_ANY, u"右寄せ", style=wx.TE_RIGHT)
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(text_1, flag=wx.GROW)
layout.Add(text_2, flag=wx.GROW)
layout.Add(text_3, flag=wx.GROW)
layout.Add(text_4, flag=wx.GROW)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
--実行結果--
text_2を左寄せ、text_3を中央寄せ、text_4を右寄せにしました。指定無しの場合はデフォルトで左寄せが適用されます。

テキストコントロールを複数行で使用する場合は、styleに「TE_MULTILINE」を指定します。
# -*- 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")
text_1 = wx.TextCtrl(panel, wx.ID_ANY)
text_2 = wx.TextCtrl(panel, wx.ID_ANY)
text_3 = wx.TextCtrl(panel, wx.ID_ANY)
text_4 = wx.TextCtrl(panel, wx.ID_ANY, style=wx.TE_MULTILINE)
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(text_1, flag=wx.GROW)
layout.Add(text_2, flag=wx.GROW)
layout.Add(text_3, flag=wx.GROW)
layout.Add(text_4, flag=wx.GROW)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
--実行結果--
text_4のみ複数行の入力が可能となりました。指定無しの場合はデフォルトで単一行が適用されます。

テキスト値を操作するメソッド集です。 「SetValue」は既存のテキスト値を引数の値で入れ替えます。 「WriteText」と「AppendText」は、既存のテキスト値の左側、右側にそれぞれ引数の値を追加します。 「Clear」は既存のテキスト値を全て消去し、「Remove」は引数で指定されたインデックスに該当する既存のテキスト値の削除を行います。 最後の「Replace」は、インデックスに該当するテキスト値を指定の文字列にて入れ替えをします。
# -*- 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")
text_1 = wx.TextCtrl(panel, wx.ID_ANY, u"テキスト1")
text_2 = wx.TextCtrl(panel, wx.ID_ANY, u"テキスト2")
text_3 = wx.TextCtrl(panel, wx.ID_ANY, u"テキスト3")
text_4 = wx.TextCtrl(panel, wx.ID_ANY, u"テキスト4")
text_5 = wx.TextCtrl(panel, wx.ID_ANY, u"テキスト5")
text_6 = wx.TextCtrl(panel, wx.ID_ANY, u"テキスト6")
text_1.SetValue("text_1")
text_2.WriteText("text_2")
text_3.AppendText("text_3")
text_4.Clear()
text_5.Remove(2, 3)
text_6.Replace(2, 3, u"す")
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(text_1, flag=wx.GROW)
layout.Add(text_2, flag=wx.GROW)
layout.Add(text_3, flag=wx.GROW)
layout.Add(text_4, flag=wx.GROW)
layout.Add(text_5, flag=wx.GROW)
layout.Add(text_6, flag=wx.GROW)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
--実行結果--
テキストコントロールの初期値と、設定したテキスト値を比較するとわかりやすいと思います。

テキスト値を取得するメソッド集です。 「GetValue」は、入力されている全テキスト値の取得を行います。 「GetStringSelection」は現在選択されている値を取得し、「GetRange」は引数で指定されたインデックスに該当するテキスト値を取得します。
# -*- 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")
text_1 = wx.TextCtrl(panel, wx.ID_ANY, u"テキスト1")
text_2 = wx.TextCtrl(panel, wx.ID_ANY, u"テキスト2")
text_3 = wx.TextCtrl(panel, wx.ID_ANY, u"テキスト3")
print text_1.GetValue()
print text_2.GetStringSelection()
print text_3.GetRange(2, 5)
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(text_1, flag=wx.GROW)
layout.Add(text_2, flag=wx.GROW)
layout.Add(text_3, flag=wx.GROW)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
--実行結果--
上記サンプルではテキスト値の選択がされていないので、「GetStringSelection」では何も取得出来ていません。

--出力結果--
テキスト1 スト3
入力されているテキスト値を選択状態とするには「SelectAll」を使用します。 また「GetSelection」にて、選択されているテキスト値のインデックスを取得する事も可能です。
# -*- 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")
text_1 = wx.TextCtrl(panel, wx.ID_ANY, u"テキスト1")
text_1.SelectAll()
print text_1.GetSelection()
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(text_1, flag=wx.GROW)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
--実行結果--

--出力結果--
(0, 5)
テキストコントロールの入力文字数を制限するには「SetMaxLength」を使用します。 ユーザーインターフェイス上でのみ有効なので、サンプルのように「SetValue」を経由すると、最大設定文字数を超過して入れる事は可能です。
# -*- 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")
text_1 = wx.TextCtrl(panel, wx.ID_ANY)
text_2 = wx.TextCtrl(panel, wx.ID_ANY)
text_1.SetMaxLength(10)
text_2.SetMaxLength(10)
text_2.SetValue("12345678901")
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(text_1, flag=wx.GROW)
layout.Add(text_2, flag=wx.GROW)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
--実行結果--

充実したGUIアプリには必ずあります!
