目的
Gtk.Entryは、ユーザーが数字や文字を入力するWidgetです。そのGtk.Entryへの入力については、①入力文字数を制限したり、②書き込みの出来ない読み込み専用にしたり、③入力した文字を表示しないパスワード専用の入力にしたりすることができます。また、④未入力時には別のテキストを表示して、そのGtk.Entryに入力する内容を説明することが可能です。
今回は、Gtk.Entryの入力を上記の4つの機能を付与する方法を見ていきます。
Gtk.Entryの設定
Gtk.Entryの設定は、プロパティやメソッドを使用して指定します。
入力文字数を制限する
Gtk.Entryの入力文字数は、プロパティmax_lengthやメソッドset_max_length()を使用して指定します。
※ サンプルプログラムの26行目でプロパティmax_lengthを使用しています。
読み込み専用にする
Gtk.Entryを読み取り専用にするのには、プロパティeditableを使用します。
※ サンプルプログラムの27行目でプロパティeditableを使用しています。
パスワード専用にする(入力文字を表示しない)
Gtk.Entryをパスワード専用にするのには、プロパティvisibilityやメソッドset_visibility()を使用します。
※ サンプルプログラムの28行目でプロパティvisibilityを使用しています。
未入力時に表示する文字列を指定する
Gtk.Entryの未入力時に表示する文字列を指定するのには、プロパティplaceholder_textやメソッドset_placeholder_text()を使用します。
※ サンプルプログラムの26行目でプロパティplaceholder_textを使用しています。
Gtk.Entryのサンプルプログラム
以下のサンプルプログラムを実行すると、下図のような3組のGtk.LabelとGtk.Entryが表示されます。Gtk.Entryの設定は、その左横のGtk.Labelや未入力時に表示される文字の通りです。
import gi
gi.require_version('Gtk', '4.0')
from gi.repository import Gtk
APPID = 'com.github.taniyoshima.g4_fblog_entry'
class Gtk4TestTest(Gtk.Window):
def __init__(self, app):
Gtk.Window.__init__(
self, application=app, title='Gtk.Entry Test',
default_width=300, default_height=200)
grid = Gtk.Grid(
margin_top=20, margin_bottom=20,
margin_start=20, margin_end=20,
row_spacing=20, column_spacing=20
)
label1 = Gtk.Label(label='①入力数制限', xalign=0.0)
label2 = Gtk.Label(label='②読み専用', xalign=0.0)
label3 = Gtk.Label(label='③パスワード専用', xalign=0.0)
entry1 = Gtk.Entry(max_length=5, placeholder_text='5文字入力')
entry2 = Gtk.Entry(editable=False, text='入力不可')
entry3 = Gtk.Entry(
max_length=10, placeholder_text='入力文字非表示',
visibility=False
)
grid.attach(label1, 0, 0, 1, 1)
grid.attach(label2, 0, 1, 1, 1)
grid.attach(label3, 0, 2, 1, 1)
grid.attach(entry1, 1, 0, 1, 1)
grid.attach(entry2, 1, 1, 1, 1)
grid.attach(entry3, 1, 2, 1, 1)
self.set_child(grid)
class Gtk4TestApp(Gtk.Application):
def __init__(self):
Gtk.Application.__init__(self, application_id=APPID)
def do_activate(self):
window = Gtk4TestTest(self)
window.present()
def main():
app = Gtk4TestApp()
app.run()
if __name__ == '__main__':
main()