Tkinterで使われるtext Widgetとは?コードを交えて徹底解説!?
今回はTkinterで活用されるtext Widgetに関して、コードを交えて解説いたします。text Widgetの使い方がわからない、サンプルコードを通して活用方法を学びたい方へおすすめです。是非最後までご覧ください。
- そもそもTkinterで利用されるtext Widgetとは?
- 下準備
- Tkinterで活用されるtext Widgetの定義
- text Widgetで活用される7種類の関数
- index(文字位置)へ自分好みの名前を設定
- 一部分の文字列に対して装飾する
- 便利なindex(文字位置)指定【早見表】
- まとめ
- 参考文献
執筆者 - おすすめの記事3選
そもそもTkinterで利用されるtext Widgetとは?
Tkinterで利用されるtext Widgetとは、Widgetの一種で文字を入力、表示できる部品を意味します。別名として、テキストボックスと呼ばれます。
知らない言葉がいくつか出てきましたね。。以下の「Tkinterの構成要素」を確認しながら、理解を深めましょう。
Tkinterの構成要素
Tkinterの構成要素として、Window, Frame, Widgetの概念が存在します。
名称 | 説明文 |
---|---|
Window | 画像の青色枠の部分になります。Tkinter画面全体を表します。 |
Frame | 画像内の緑色枠の部分になります。Widgetが1つ以上ある場合に、取りまとめるものです。 |
Widget | 紫色枠で囲まれる部分になります。1つの機能を持つ最小単位 = Widgetと考えると良いでしょう。 |
前の章でTkinterで活用されるtext Widgetとは、Widgetの一種で文字を入力、表示できる部品とお伝えしました。
「Tkinterの構成要素」の画像内では、紫色枠に該当するWidgetに対して、編集することになります。
Tkinterの構成要素を理解したところで、実際にtext Widgetの活用方法を理解していきましょう。
下準備
今回は先ほど紹介した「Tkinterの構成要素」の画像を元に、text Widgetの使い方をお伝えします。
下にコードを貼り付けておきますので、画像と見比べながら、コードを確認してみてください。できればコードに触れて、一緒にtext Widgetを実装しましょう。
1import tkinter as tk
2
3class Application(tk.Frame):
4 # text Widgetに関する情報を格納する変数
5 text = None
6
7 def __init__(self, master=None):
8 # Windowの初期設定を行う。
9 super().__init__(master)
10
11 # Windowの画面サイズを設定する。
12 # geometryについて : https://kuroro.blog/python/rozH3S2CYE0a0nB3s2QL/
13 self.master.geometry("300x200")
14
15 # Windowを親要素として、frame Widget(Frame)を作成する。
16 # Frameについて : https://kuroro.blog/python/P20XOidA5nh583fYRvxf/
17 frame = tk.Frame(self.master)
18
19 # Windowを親要素とした場合に、frame Widget(Frame)をどのように配置するのか?
20 # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
21 frame.pack()
22
23 # frame Widget(Frame)を親要素として、text Widgetを作成する。
24 self.text = tk.Text(frame)
25
26 # frame Widget(Frame)を親要素とした場合に、text Widgetをどのように配置するのか?
27 # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
28 self.text.pack()
29
30# Tkinter初学者参考 : https://docs.python.org/ja/3/library/tkinter.html#a-simple-hello-world-program
31if __name__ == "__main__":
32 # Windowを生成する。
33 # Windowについて : https://kuroro.blog/python/116yLvTkzH2AUJj8FHLx/
34 root = tk.Tk()
35 app = Application(master=root)
36 # Windowをループさせて、継続的にWindow表示させる。
37 # mainloopについて : https://kuroro.blog/python/DmJdUb50oAhmBteRa4fi/
38 app.mainloop()
上記のコードをPython環境で実行すると、「Tkinterの構成要素」で紹介した画像の結果が表示されます。
Tkinterで活用されるtext Widgetの定義
text Widgetは、
1tk.Text(option1, option2, ...) or tk.Text('親要素', option1, option2, ...)
で定義されます。
text Widgetで使われるoptionの種類としては
- background, bg
- bd, borderwidth
- blockcursor
- cursor
- fg, foreground
- font
- height, width
- highlightcolor, highlightbackground, highlightthickness
- insertbackground
- insertofftime, insertontime
- insertwidth
- padx, pady
- relief
- selectbackground, selectforeground
- state
- undo
- xscrollcommand, yscrollcommand
があります。順番に見ていきましょう。
※ optionの種類一覧を調べたい場合は、以下のようにコードを記述してご確認ください。
1import tkinter as tk
2
3# text Widgetを生成する。
4text = tk.Text()
5# text Widgetに関するoptionの種類一覧を取得する。
6print(text.keys())
background, bg
background option, bg optionを利用すると、text Widgetの背景色を設定できます。
backgroundとbg両方のoptionを用いて、値を設定した場合、後ろの引数に設定されるoptionが優先されます。
色に関しては、Tkinterの色の使い方とは?活用例から色の一覧をまとめて紹介!?で総括していますので、詳しく知りたい方は是非ご確認ください。
例えば下準備コードのself.text = tk.Text(frame)
箇所を、以下のように変更すると、
1# 別解法 ##########################
2# self.text = tk.Text(frame)
3# self.text.config(bg="red") or self.text.configure(bg="red")
4##################################
5# 色について : https://kuroro.blog/python/YcZ6Yh4PswqUzaQXwnG2/
6self.text = tk.Text(frame, bg="red")
以下の画像のようにtext Widgetを描画します。
bd, borderwidth
bd option, borderwidth optionを利用すると、text Widgetの枠の大きさを設定できます。
bdとborderwidth両方のoptionを用いて、値を設定した場合、後ろの引数に設定されるoptionが優先されます。
例えば下準備コードのself.text = tk.Text(frame)
箇所を、以下のように変更すると、
1# 別解法 ##########################
2# self.text = tk.Text(frame)
3# self.text.config(bd=30) or self.text.configure(bd=30)
4##################################
5self.text = tk.Text(frame, bd=30)
以下の画像のようにtext Widgetを描画します。
blockcursor
blockcursor optionを利用すると、入力画面で点滅するカーソルの見た目を|
から🔳
へ変更できます。
それぞれTrue(🔳
にする), False(|
にする(デフォルト))の値を設定できます。
例えば下準備コードのself.text = tk.Text(frame)
箇所を、以下のように変更すると、
1# 別解法 ##########################
2# self.text = tk.Text(frame)
3# self.text.config(blockcursor=True) or self.text.configure(blockcursor=True)
4##################################
5self.text = tk.Text(frame, blockcursor=True)
以下の画像のようにtext Widgetを描画します。
cursor
cursor optionを利用すると、text Widget内へマウスカーソルを移動すると、矢印の見た目を変化できます。
見た目のバリエーションについてはこちらのサイトにまとまっていますので、ご確認ください。
例えば下準備コードのself.text = tk.Text(frame)
箇所を、以下のように変更して、
1# 別解法 ##########################
2# self.text = tk.Text(frame)
3# self.text.config(cursor='clock') or self.text.configure(cursor='clock')
4##################################
5self.text = tk.Text(frame, cursor='clock')
text Widget内へマウスカーソルを移動すると、矢印の見た目が変更します。
fg, foreground
fg option, foreground optionを利用すると、入力された文字列色を変更できます。
fgとforeground両方のoptionを用いて、値を設定した場合、後ろの引数に設定されるoptionが優先されます。
例えば下準備コードのself.text = tk.Text(frame)
箇所を、以下のように変更すると、
1# 別解法 ##########################
2# self.text = tk.Text(frame)
3# self.text.config(fg='red') or self.text.configure(fg='red')
4##################################
5# 色について : https://kuroro.blog/python/YcZ6Yh4PswqUzaQXwnG2/
6self.text = tk.Text(frame, fg='red')
以下の画像のようにtext Widgetを描画します。
font
font optionを利用すると、文字の形式や大きさを変更できます。
fontに関しては、Tkinterで使われるフォントって?2種類のフォントの設定方法を丁寧に解説でまとめておりますので、詳しく知りたい方は是非ご確認ください。
例えば下準備コードのself.text = tk.Text(frame)
箇所を、以下のように変更すると、
1# 別解法 ##########################
2# self.text = tk.Text(frame)
3# self.text.config(font=("", 20, "underline")) or self.text.configure(font=("", 20, "underline"))
4##################################
5# fontについて : https://kuroro.blog/python/RZNjLl36upkumxwkTRWl/
6self.text = tk.Text(frame, font=("", 20, "underline"))
以下の画像のようにtext Widgetを描画します。
height, width
height option, width optionを利用すると、それぞれtext Widgetへ表示可能な行数・1行あたりに入力可能な文字数を設定できます。
デフォルトとしてheight=24(24行表示), width=80(1行あたり80文字を入力可能)が設定されています。
例えば下準備コードのself.text = tk.Text(frame)
箇所を、以下のように変更すると、
1# 別解法 ##########################
2# self.text = tk.Text(frame)
3# self.text.config(width=5, height=5) or self.text.configure(width=5, height=5)
4##################################
5self.text = tk.Text(frame, width=5, height=5)
以下の画像のようにtext Widgetを描画します。
highlightcolor, highlightbackground, highlightthickness
highlightcolor option, highlightbackground option, highlightthickness optionを利用すると、それぞれ入力画面へカーソルがあてられた時の囲い線の色, 入力画面へカーソルが外れている時の囲い線の色(デフォルト), 囲い線の太さを設定します。
例えば下準備コードのself.text = tk.Text(frame)
箇所を、以下のように変更すると、
1# 別解法 ##########################
2# self.text = tk.Text(frame)
3# self.text.config(highlightthickness=20, highlightbackground="red", highlightcolor="blue") or self.text.configure(highlightthickness=20, highlightbackground="red", highlightcolor="blue")
4##################################
5# 色について : https://kuroro.blog/python/YcZ6Yh4PswqUzaQXwnG2/
6self.text = tk.Text(frame, highlightthickness=20, highlightbackground="red", highlightcolor="blue")
入力画面へカーソルがあてられた場合に、以下の画像のようにtext Widgetを描画して、
入力画面へカーソルが外れている場合に、以下の画像のようにtext Widgetを描画します。
insertbackground
insertbackground optionを利用すると、入力画面で点滅するカーソルの背景色を変更できます。
例えば下準備コードのself.text = tk.Text(frame)
箇所を、以下のように変更すると、
1# 別解法 ##########################
2# self.text = tk.Text(frame)
3# self.text.config(insertbackground='red') or self.text.configure(insertbackground='red')
4##################################
5# 色について : https://kuroro.blog/python/YcZ6Yh4PswqUzaQXwnG2/
6self.text = tk.Text(frame, insertbackground='red')
以下の画像のようにtext Widgetを描画します。
insertofftime, insertontime
insertofftime optionを利用すると、入力画面で点滅するカーソルが表示されてから消えるまでの時間(ミリ秒)を指定できます。0を指定すると、点滅なしになります。デフォルトは300ミリ秒です。
insertontime optionを利用すると、入力画面で点滅するカーソルが消えてから表示されるまでの時間(ミリ秒)を指定できます。デフォルトは600ミリ秒です。
insertwidth
insertwidth optionを利用すると、入力画面で点滅するカーソルの幅を変更できます。
例えば下準備コードのself.text = tk.Text(frame)
箇所を、以下のように変更すると、
1# 別解法 ##########################
2# self.text = tk.Text(frame)
3# self.text.config(insertwidth=20, insertbackground='red') or self.text.configure(insertwidth=20, insertbackground='red')
4##################################
5self.text = tk.Text(frame, insertwidth=20, insertbackground='red')
以下の画像のようにtext Widgetを描画します。
padx, pady
padx option, pady optionを設定すると、文字列の外側へ空白の幅を設定できます。
例えば下準備コードのself.text = tk.Text(frame)
箇所を、以下のように変更すると、
1# 別解法 ##########################
2# self.text = tk.Text(frame)
3# self.text.config(padx=30, pady=30) or self.text.configure(padx=30, pady=30)
4##################################
5self.text = tk.Text(frame, padx=30, pady=30)
以下の画像のようにtext Widgetを描画します。
relief
relief optionを利用すると、text Widgetの枠のデザインを設定できます。
指定方法としては、
- tk.RAISED
- tk.SUNKEN
- tk.FLAT
- tk.RIDGE
- tk.GROOVE
- tk.SOLID
の6種類があります。
例えば下準備コードを、以下のように変更すると、
1+ reliefList = [tk.RAISED, tk.SUNKEN, tk.FLAT, tk.RIDGE, tk.GROOVE, tk.SOLID]
2+ for relief in reliefList:
3- self.text = tk.Text(frame)
4+ self.text = tk.Text(frame, relief=relief, bd=20, height=5, width=5)
5
6- self.text.pack()
7+ self.text.pack(side=tk.LEFT)
以下の画像のようにtext Widgetを描画します。
selectbackground, selectforeground
selectbackground option, selectforeground optionを利用すると、それぞれ選択された文字列の背景色・文字列色を変更できます。
例えば下準備コードのself.text = tk.Text(frame)
箇所を、以下のように変更すると、
1# 別解法 ##########################
2# self.text = tk.Text(frame)
3# self.text.config(selectbackground='red', selectforeground='green') or self.text.configure(selectbackground='red', selectforeground='green')
4##################################
5# 色について : https://kuroro.blog/python/YcZ6Yh4PswqUzaQXwnG2/
6self.text = tk.Text(frame, selectbackground='red', selectforeground='green')
以下の画像のようにtext Widgetを描画します。
state
state optionを利用すると、text Widgetの状態を設定できます。
指定方法としては、
- normal : 文字入力を有効(デフォルト)
- disabled : 文字入力を無効
があります。
例えば下準備コードのself.text = tk.Text(frame)
箇所を、以下のように変更すると、
1# 別解法 ##########################
2# self.text = tk.Text(frame)
3# self.text.config(state='disabled') or self.text.configure(state='disabled')
4##################################
5self.text = tk.Text(frame, state='disabled')
以下の画像のようにtext Widgetを描画し、文字入力できなくなります。
undo
undo optionを利用すると、直前の文字列状態へ復元を可能にします。
それぞれTrue(直前の文字列状態へ復元可), False(直前の文字列状態へ復元不可(デフォルト))の値を設定できます。
直前の文字列状態へ復元する場合、コマンドとして、Macの場合(command + z), Windowsの場合(control + z)で実行できます。
xscrollcommand, yscrollcommand
xscrollcommand option, yscrollcommand optionに関しては、Tkinterで使われるscrollbarとは?活用事例を交えて徹底解説の「scrollbar Widgetの設定手順」でまとめておりますので、是非ご確認ください。
text Widgetで活用される7種類の関数
text Widgetで活用される関数として、
- insert
- compare
- get
- delete
- index
- see
- window_create
の7種類存在します。順に見ていきましょう。
insert
insert関数を利用すると、text Widget内へ文字列を挿入できます。
1# 文字列を挿入する関数
2# 第一引数 : index(文字位置)
3# 第二引数 : 文字列
4.insert('index(文字位置)', '文字列')
で定義されます。戻り値はありません。
例えば下準備コードのself.text = tk.Text(frame)
の下へ、以下のコードを記述すると、
1def __init__(self, master=None):
2 ...
3 self.text = tk.Text(frame)
4+ # 第一引数 : index(文字位置)。
5+ # 1.0 : 一行目の0番目(先頭)に文字列を挿入する。
6+ # 仮に'アイウエオ'の文字だけが一行目に入力されている場合、index(文字位置)が1.0なのは'ア', index(文字位置)が1.1なのは'イ', index(文字位置)が1.2なのは'ウ', index(文字位置)が1.3なのは'エ', index(文字位置)が1.4なのは'オ'となる。
7+ # 第二引数 : 文字列。"テストテスト"の文字列を挿入する。
8+ self.text.insert('1.0', 'テストテスト')
以下の画像のように'テストテスト'の文字列を挿入します。
compare
compare関数を利用すると、index(文字位置)の比較結果を得られます。
1# index(文字位置)の比較結果を取得する関数
2# 第一引数 : index1(文字位置)
3# 第二引数 : operation(= or > or <)
4# 第三引数 : index2(文字位置)
5.compare('index1(文字位置)', operation(= or > or <), 'index2(文字位置)')
で定義されます。戻り値としては、True(式が正しい場合), False(式が正しくない場合)が返されます。
例えば下準備コードのself.text = tk.Text(frame)
の下へ、以下のコードを記述すると、
1def __init__(self, master=None):
2 ...
3 self.text = tk.Text(frame)
4+ # 第一引数 : index(文字位置)。
5+ # 1.0 : 一行目の0番目(先頭)に文字列を挿入する。
6+ # 第二引数 : 文字列。"テストテスト\nテスト1テスト1\nテスト2テスト2"の値を挿入する。\nは改行文字。
7+ self.text.insert('1.0', 'テストテスト\nテスト1テスト1\nテスト2テスト2')
8
9+ # 第一引数 : index1(文字位置)。5行目0番目
10+ # 第二引数 : operation
11+ # 第三引数 : index2(文字位置)。
12+ # tk.END : 最終文字のindex(文字位置)。
13+ # 戻り値 : 条件に合致する場合True 、合致しない場合Falseを返す。今回ならば、第一引数 < 第三引数の条件に合うかどうかの戻り値を返す。
14+ print(self.text.compare('5.0', '<', tk.END))
以下の画像のようにFalseが表示されます。
get
get関数を利用すると、index(文字位置)に該当する値(文字 or 文字列)を取得できます。
1# 文字を取得する場合
2# 第一引数 : index(文字位置)
3# 戻り値 : 第一引数に該当する文字を取得
4.get('index(文字位置)')
5
6# 文字列を取得する場合
7# 第一引数 : 開始index(文字位置)
8# 第二引数 : 終わりindex(文字位置)
9# 戻り値 : 第一引数から第二引数の間に該当する文字列を取得
10.get('開始index(文字位置)', '終わりindex(文字位置)')
で定義されます。戻り値としては、文字 or 文字列が返されます。
例えば下準備コードのself.text = tk.Text(frame)
の下へ、以下のコードを記述すると、
1def __init__(self, master=None):
2 ...
3 self.text = tk.Text(frame)
4+ # 第一引数 : index(文字位置)。一行目の0番目(先頭)に文字列を挿入する。
5+ # 第二引数 : 文字列。"テストテスト\nテスト1テスト1\nテスト2テスト2"の文字列を挿入する。\nは改行文字。
6+ self.text.insert('1.0', 'テストテスト\nテスト1テスト1\nテスト2テスト2')
7
8+ # 第一引数 : index(文字位置)。一行目の0番目
9+ # 戻り値 : 第一引数に該当する文字を取得
10+ print(self.text.get('1.0'))
以下の画像のように"テ"を取得できます。
また下準備コードのself.text = tk.Text(frame)
の下へ、以下のコードを記述すると、
1def __init__(self, master=None):
2 ...
3 self.text = tk.Text(frame)
4+ # 第一引数 : index(文字位置)。一行目の0番目(先頭)に文字列を挿入する。
5+ # 第二引数 : 文字列。"テストテスト\nテスト1テスト1\nテスト2テスト2"の文字列を挿入する。\nは改行文字。
6+ self.text.insert('1.0', 'テストテスト\nテスト1テスト1\nテスト2テスト2')
7
8+ # 第一引数 : 開始index(文字位置)。一行目0番目
9+ # 第二引数 : 終わりindex(文字位置)。二行目0番目
10+ # 戻り値 : 第一引数から第二引数の間に該当する文字列を取得
11+ print(self.text.get('1.0', '2.0'))
以下の画像のように"テストテスト"を取得できます。
delete
delete関数を利用すると、index(文字位置)に該当する値(文字 or 文字列)を削除できます。
1# 文字を削除する場合
2# 第一引数に該当する文字を削除
3# 第一引数 : index(文字位置)
4.delete('index(文字位置)')
5
6# 文字列を削除する場合
7# 第一引数から第二引数の間に該当する文字列を削除
8# 第一引数 : 開始index(文字位置)
9# 第二引数 : 終わりindex(文字位置)
10.delete('開始index(文字位置)', '終わりindex(文字位置)')
で定義されます。戻り値はありません。
例えば下準備コードのself.text = tk.Text(frame)
の下へ、以下のコードを記述すると、
1def __init__(self, master=None):
2 ...
3 self.text = tk.Text(frame)
4+ # 第一引数 : index(文字位置)。一行目の0番目(先頭)に文字列を挿入する。
5+ # 第二引数 : 文字列。"テストテスト\nテスト1テスト1\nテスト2テスト2"の文字列を挿入する。\nは改行文字。
6+ self.text.insert('1.0', 'テストテスト\nテスト1テスト1\nテスト2テスト2')
7
8+ # 第一引数 : index(文字位置)。一行目の0番目
9+ self.text.delete('1.0')
以下の画像のように先頭の"テ"の文字を削除されます。
また下準備コードのself.text = tk.Text(frame)
の下へ、以下のコードを記述すると、
1def __init__(self, master=None):
2 ...
3 self.text = tk.Text(frame)
4+ # 第一引数 : index(文字位置)。一行目の0番目(先頭)に文字列を挿入する。
5+ # 第二引数 : 文字列。"テストテスト\nテスト1テスト1\nテスト2テスト2"の文字列を挿入する。\nは改行文字。
6+ self.text.insert('1.0', 'テストテスト\nテスト1テスト1\nテスト2テスト2')
7
8+ # 第一引数 : 開始index(文字位置)。一行目0番目
9+ # 第二引数 : 終わりindex(文字位置)。二行目0番目
10+ self.text.delete('1.0', '2.0')
以下の画像のように"テストテスト"の文字列を削除します。
index
index関数を利用すると、index(文字位置)を取得できます。
1# index(文字位置)を取得する関数
2# 第一引数 : index(文字位置)(後の章で紹介します、「便利なindex(文字位置)指定【早見表】」をご確認ください。)
3# 戻り値 : 第一引数に該当するindex(文字位置)
4.index('index(文字位置)')
で定義されます。戻り値として、index(文字位置)を取得します。
例えば下準備コードのself.text = tk.Text(frame)
の下へ、以下のコードを記述すると、
1def __init__(self, master=None):
2 ...
3 self.text = tk.Text(frame)
4+ # 第一引数 : index(文字位置)。一行目の0番目(先頭)に文字列を挿入する。
5+ # 第二引数 : 文字列。"テストテスト\nテスト1テスト1\nテスト2テスト2"の文字列を挿入する。\nは改行文字。
6+ self.text.insert('1.0', 'テストテスト\nテスト1テスト1\nテスト2テスト2')
7
8+ # 第一引数 : index(文字位置)
9+ # tk.END : 最終文字のindex(文字位置)。
10+ # 戻り値 : 第一引数に該当するindex(文字位置)
11+ print(self.text.index(tk.END))
以下の画像のように最終文字のindex(文字位置)を取得します。
see
see関数を利用すると、index(文字位置)の行へ画面移動できます。
1# index(文字位置)の行へ画面移動する関数
2# 第一引数 : index(文字位置)
3.see('index(文字位置)')
で定義されます。戻り値はありません。
例えば下準備コードのself.text = tk.Text(frame)
の下へ、以下のコードを記述すると、
1def __init__(self, master=None):
2 ...
3 self.text = tk.Text(frame)
4+ # 第一引数 : index(文字位置)。一行目の0番目(先頭)に文字列を挿入する。
5+ # 第二引数 : 文字列。'あ\nい\nう\nえ\nお\nか\nき\nく\nけ\nこ\nさ\nし\nす\nせ\nそ\nた\nち\nつ\nて\nと\nな\nに\nぬ\nね\nの\nは\nひ\nふ\nへ\nほ'の文字列を挿入する。\nは改行文字。
6+ self.text.insert('1.0', 'あ\nい\nう\nえ\nお\nか\nき\nく\nけ\nこ\nさ\nし\nす\nせ\nそ\nた\nち\nつ\nて\nと\nな\nに\nぬ\nね\nの\nは\nひ\nふ\nへ\nほ')
7
8+ # 第一引数 : index(文字位置)
9+ # 5.0 : 五行目0番目
10+ self.text.see('5.0')
以下の画像のように"お"の行へ画面移動して表示されます。
window_create
window_create関数を利用すると、index(文字位置)へWidgetを配置できます。
1# index(文字位置)へWidgetを配置する関数
2# 第一引数 : index(文字位置)
3# 第二引数以降 : option
4.window_create('index(文字位置)', option1, option2, ...)
で定義されます。戻り値はありません。
例えば下準備コードのself.text = tk.Text(frame)
の下へ、以下のコードを記述すると、
1def __init__(self, master=None):
2 ...
3 self.text = tk.Text(frame)
4
5+ # 第一引数 : index(文字位置)
6+ # 1.0 : 一行目0番目
7+ # window : 表示したいWidget
8+ # Labelについて : https://kuroro.blog/python/Pj4Z7JBNRvcHZvtFqiKD/
9+ self.text.window_create('1.0', window=tk.Label(text='aiueo'))
以下の画像のように'aiueo'と書かれたlabel Widgetを表示できます。
label Widgetに関しては、【初学者必見!?】Tkinterで使われるlabelの活用方法を徹底解説でまとめておりますので、是非ご確認ください。
index(文字位置)へ自分好みの名前を設定
先ほどは「text Widgetで活用される7種類の関数」に関して説明しました。
利用する中で気づいた方もいるかもしれませんが、関数を利用する場合、index(文字位置)を指定して操作する必要があります。
恐らくindex(文字位置)を指定しないと、どこに対して関数実行したいのか指し示すのが難しいのでしょう。
「index(文字位置)へ自分好みの名前を設定」の章では、index(文字位置)へ自分好みの名前を設定するmarkに関して解説いたします。
mark
markとは、index(文字位置)に対し、自分好みの名前をつけて登録することを言います。markすることで、関数で使われるindex(文字位置)に対しmarkを利用でき、index(文字位置)管理を容易にします。
markに関連する関数一覧は以下のようになります。
関数名 | 説明文 | 用例 |
---|---|---|
mark_set(markname, index(文字位置)) | markする関数になります。第一引数へ自分好みの名前、第二引数へindex(文字位置)を設定して登録します。 | self.text.mark_set('hoge', '1.1') |
mark_names() | markされている名前一覧を取得します。 | print(self.text.mark_names()) |
mark_unset(markname) | markされている名前を指定して、markの解除を行います。 | self.text.mark_unset('hoge') |
index(markname) | markされている名前を指定して、index(文字位置)を取得します。 | print(self.text.index('hoge')) |
mark_next(index(文字位置)) | index(文字位置)よりも大きいindex(文字位置)を保持する、index(文字位置)に一番近いmarkされている名前を取得します。 | print(self.text.mark_next('1.0')) |
mark_previous(index(文字位置)) | index(文字位置)よりも小さいindex(文字位置)を保持する、index(文字位置)に一番近いmarkされている名前を取得します。 | print(self.text.mark_previous('1.2')) |
mark_gravity(markname, 'left' or 'right') | markを使ってinsert関数を実行した際に、挿入文字列の左 or 右のどちらを基準にindex(文字位置)を再設定するか定めるもの。デフォルトはright。 | self.text.mark_gravity('hoge', 'right') |
例えば下準備コードのself.text = tk.Text(frame)
の下へ、以下のコードを記述すると、
1def __init__(self, master=None):
2 ...
3 self.text = tk.Text(frame)
4
5+ # 第一引数 : 自分好みの名前。hoge
6+ # 第二引数 : index(文字位置)。一行目0番目。
7+ self.text.mark_set('hoge', '1.0')
8
9+ # 第一引数 : markされている名前。index(文字位置)の代わりとなる。
10+ # 第二引数 : 文字列。"テストテスト"の文字列を挿入する。
11+ self.text.insert('hoge', 'テストテスト')
以下の画像のように、markを活用して"テストテスト"を挿入できます。
一部分の文字列に対して装飾する
一部分の文字列に対して、背景色を変えたり文字列色を変更したい場合もあるかと思います。
その場合にtagを利用すると便利です。
tag
tagとは、開始index(文字位置)から終わりindex(文字位置)の文字列に対し、自分好みの名前をつけて登録することを言います。tagを利用することで、一部分の文字列に対し背景色を変えたり文字列色を変更できます。
tagに関連する関数一覧は以下のようになります。
関数名 | 説明文 | 用例 |
---|---|---|
tag_add(tagname, 開始index(文字位置), 終わりindex(文字位置)) | tagを登録する関数になります。第一引数へ自分好みの名前、第二引数へ開始index(文字位置)、第三引数へ終わりindex(文字位置)を設定して登録します。 | self.text.tag_add('hoge', '1.0', '2.0') |
tag_config(tagname, option1, option2, ...) or tag_configure(tagname, option1, option2, ...) | tag名に対し、オプションを設定します。例えば、背景色を変更する場合に、background='red' 、文字列色を変更する場合にforeground='green' のように設定します。 | self.text.tag_config('hoge', foreground="red") |
tag_delete(tagname) | tag名を指定して、登録解除を行います。 | self.text.tag_delete('hoge') |
tag_remove(tagname, 開始index(文字位置), 終わりindex(文字位置)) | tag名を指定して、開始index(文字位置)から終わりindex(文字位置)の文字列をtagとして解除します。※tag自体の登録解除が行われるわけではなく、範囲文字列が解除されます。 | self.text.tag_remove('hoge', '1.0', '1.2') |
tag_cget(tagname, optionname) | 第一引数へtag名、第二引数へオプションの名前を指定することで、tag名に紐づく指定オプションの値を取得できます。 | print(self.text.tag_cget('hoge', 'foreground')) |
tag_names(index(文字位置)) | index(文字位置)に関係するtag名一覧を取得できます。 | print(self.text.tag_names('1.0')) |
tag_ranges(tagname) | tag名に関係する開始index(文字位置), 終わりindex(文字位置)一覧を取得できます。 | print(self.text.tag_ranges('tag名')) |
例えば下準備コードのself.text = tk.Text(frame)
の下へ、以下のコードを記述すると、
1def __init__(self, master=None):
2 ...
3 self.text = tk.Text(frame)
4
5+ # 第一引数 : index(文字位置)。一行目の0番目(先頭)に文字列を挿入する。
6+ # 第二引数 : 文字列。'テストテスト'の文字列を挿入する。
7+ self.text.insert('1.0', 'テストテスト')
8
9+ # 第一引数 : tag名
10+ # 第二引数 : 開始index(文字位置)。一行目の0番目(先頭)
11+ # 第三引数 : 終わりindex(文字位置)。一行目の2番目
12+ self.text.tag_add('hoge', '1.0', '1.3')
13+ # 第一引数 : tag名
14+ # 第二引数 : option。
15+ # forground : 文字列色を変更。redにする。
16+ # 色について : https://kuroro.blog/python/YcZ6Yh4PswqUzaQXwnG2/
17+ self.text.tag_config('hoge', foreground="red")
以下の画像のように"テストテスト"の最初の'テスト'の文字列色を赤色に変更します。
便利なindex(文字位置)指定【早見表】
最後に便利なindex(文字位置)指定【早見表】をご紹介いたします。
index(文字位置) | 説明文 | 用例 |
---|---|---|
'1.0' | 1行目の0番目のindex(文字位置) | self.text.insert('1.0', 'あいうえお') |
'1.3' | 1行目の2番目のindex(文字位置) | self.text.insert('1.3', 'あいうえお') |
'2.0' | 2行目の0番目のindex(文字位置) | self.text.insert('2.0', 'あいうえお') |
'1.end' | 1行目の最終文字のindex(文字位置) | self.text.insert('1.end', 'あいうえお') |
'end' | 最終文字のindex(文字位置) | self.text.insert('end', 'あいうえお') |
'insert' | カーソルのindex(文字位置) | self.text.insert('insert', 'あいうえお') |
'insert linestart' or 'insert wordstart' | カーソルのindex(文字位置)と同じ行で先頭のindex(文字位置) | self.text.insert('insert linestart', 'あいうえお') or self.text.insert('insert wordstart', 'あいうえお') |
'insert lineend' or 'insert wordend' | カーソルのindex(文字位置)と同じ行で末尾のindex(文字位置) | self.text.insert('insert lineend', 'あいうえお') or self.text.insert('insert wordend', 'あいうえお') |
'insert +1c' | カーソルのindex(文字位置)の1つ次のindex(文字位置) | self.text.insert('insert +1c', 'あいうえお') |
'insert -1c' | カーソルのindex(文字位置)の1つ前のindex(文字位置) | self.text.insert('insert -1c', 'あいうえお') |
'insert +1lines' | カーソルのindex(文字位置)の次の行で同じ番目のindex(文字位置) | self.text.insert('insert +1lines', 'あいうえお') |
'insert -1lines' | カーソルのindex(文字位置)の前の行で同じ番目のindex(文字位置) | self.text.insert('insert -1lines', 'あいうえお') |
'insert +1lines linestart' | カーソルのindex(文字位置)の次の行で、先頭のindex(文字位置) | self.text.insert('insert +1lines linestart', 'あいうえお') |
'insert -1lines linestart' | カーソルのindex(文字位置)の前の行で、先頭のindex(文字位置) | self.text.insert('insert -1lines linestart', 'あいうえお') |
'insert +1lines lineend' | カーソルのindex(文字位置)の次の行で末尾のindex(文字位置) | self.text.insert('insert +1lines lineend', 'あいうえお') |
'insert -1lines lineend' | カーソルのindex(文字位置)の前の行で末尾のindex(文字位置) | self.text.insert('insert -1lines lineend', 'あいうえお') |
'@x,y' | x, y座標に近い文字のindex(文字位置) | self.text.insert('@0,0', 'あいうえお') |
'sel.first' | 選択した文字列の先頭のindex(文字位置) | self.text.insert('sel.first', 'あいうえお') |
'sel.last' | 選択した文字列の末尾のindex(文字位置) | self.text.insert('sel.last', 'あいうえお') |
'{tag名}.first' | tag名の先頭文字列のindex(文字位置) | self.text.insert('{tag名}.first', 'あいうえお') |
'{tag名}.last' | tag名の末尾文字列のindex(文字位置) | self.text.insert('{tag名}.last', 'あいうえお') |
まとめ
- Tkinterの構成要素として、Window, Frame, Widgetの概念が存在する。
- Tkinterで利用されるtext Widgetとは、Widgetの一種で文字を入力、表示できる部品を意味します。
- text Widgetの関数を使う場合は、index(文字位置)を指定する必要がある。