KURORO BLOGのロゴ

このエントリーをはてなブックマークに追加
Tkinterで使われるtext Widgetとは?コードを交えて徹底解説!?

Tkinterで使われるtext Widgetとは?コードを交えて徹底解説!?

今回はTkinterで活用されるtext Widgetに関して、コードを交えて解説いたします。text Widgetの使い方がわからない、サンプルコードを通して活用方法を学びたい方へおすすめです。是非最後までご覧ください。

目次
  1. そもそもTkinterで利用されるtext Widgetとは?
    1. Tkinterの構成要素
  2. 下準備
  3. Tkinterで活用されるtext Widgetの定義
    1. background, bg
    2. bd, borderwidth
    3. blockcursor
    4. cursor
    5. fg, foreground
    6. font
    7. height, width
    8. highlightcolor, highlightbackground, highlightthickness
    9. insertbackground
    10. insertofftime, insertontime
    11. insertwidth
    12. padx, pady
    13. relief
    14. selectbackground, selectforeground
    15. state
    16. undo
    17. xscrollcommand, yscrollcommand
  4. text Widgetで活用される7種類の関数
    1. insert
    2. compare
    3. get
    4. delete
    5. index
    6. see
    7. window_create
  5. index(文字位置)へ自分好みの名前を設定
    1. mark
  6. 一部分の文字列に対して装飾する
    1. tag
  7. 便利なindex(文字位置)指定【早見表】
  8. まとめ
  9. 参考文献
目次を開く⬇︎

そもそも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(文字位置)を指定する必要がある。

参考文献