wx.TextCtrl (wxPython) | Python-izm

TextCtrl

テキスト値の入力を行う事が出来るTextCtrlの解説です。入力値がユーザー任せとなるため、正しい設定・きちんとしたエラー処理が必須となりますが、その分自由度が高いです。

基本的な使い方

パネルへテキストコントロールを追加しています。引数には(親ウィンドウ、識別子)の順番で渡していますが、追加で初期値を設定する事も可能です(12行目)。

import wx

application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, 'テストフレーム', 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, '初期値')

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を使用します。

import wx

application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, 'テストフレーム', 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, 'カスタム')

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を使用します。サンプルでは赤へ変更しています。

import wx

application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, 'テストフレーム', 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, 'カスタム')

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を使用します。サンプルでは背景色を青へ、文字色を白へ変更しています。

import wx

application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, 'テストフレーム', 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, 'カスタム')

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を使用しましょう。

import wx

application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, 'テストフレーム', 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, 'カスタム')

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_LEFTTE_CENTERTE_RIGHTを指定します。

import wx

application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, 'テストフレーム', 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, '左寄せ', style=wx.TE_LEFT)
text_3 = wx.TextCtrl(panel, wx.ID_ANY, '中央寄せ', style=wx.TE_CENTER)
text_4 = wx.TextCtrl(panel, wx.ID_ANY, '右寄せ', 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を指定します。

import wx

application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, 'テストフレーム', 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は既存のテキスト値を引数の値で入れ替えます。WriteTextAppendTextは、既存のテキスト値の左側、右側にそれぞれ引数の値を追加します。Clearは既存のテキスト値を全て消去し、Removeは引数で指定されたインデックスに該当する既存のテキスト値の削除を行います。最後のReplaceは、インデックスに該当するテキスト値を指定の文字列にて入れ替えをします。

import wx

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

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

text_1 = wx.TextCtrl(panel, wx.ID_ANY, 'テキスト1')
text_2 = wx.TextCtrl(panel, wx.ID_ANY, 'テキスト2')
text_3 = wx.TextCtrl(panel, wx.ID_ANY, 'テキスト3')
text_4 = wx.TextCtrl(panel, wx.ID_ANY, 'テキスト4')
text_5 = wx.TextCtrl(panel, wx.ID_ANY, 'テキスト5')
text_6 = wx.TextCtrl(panel, wx.ID_ANY, 'テキスト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, 'す')

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は引数で指定されたインデックスに該当するテキスト値を取得します。

import wx

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

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

text_1 = wx.TextCtrl(panel, wx.ID_ANY, 'テキスト1')
text_2 = wx.TextCtrl(panel, wx.ID_ANY, 'テキスト2')
text_3 = wx.TextCtrl(panel, wx.ID_ANY, 'テキスト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にて、選択されているテキスト値のインデックスを取得する事も可能です。

import wx

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

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

text_1 = wx.TextCtrl(panel, wx.ID_ANY, 'テキスト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を経由すると、最大設定文字数を超過して設定する事は可能です。

import wx

application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, 'テストフレーム', 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()