このページでは、Tkinter の「メッセージウィジェット」の作成方法・使い方・設定方法等について説明していきたいと思います。
Contents
メッセージウィジェットとは
まずは、今回解説する「メッセージウィジェット」がどのようなウィジェットであるのかについて簡単に説明していきます。
メッセージウィジェット=複数行版のラベルウィジェット
メッセージウィジェットは、一言で表せば「複数行バージョンのラベルウィジェット」になります。
メッセージウィジェットも、ラベルウィジェット同様に文字列の表示を行うウィジェットになります。
ただし、基本的にはラベルウィジェットは1行のみの文字列を表示するウィジェットであり、単語やタイトル等の表示に利用されることが多いです。
それに対し、メッセージウィジェットは複数行の文字列を表示するウィジェットであり、長文のメッセージ等の表示に利用されることが多いです。
補足しておくと、別にラベルウィジェットでも、表示する文字列に改行を入れれば複数行の文字列を表示することは可能です。ただ、メッセージウィジェットでは自動的な文字列の折り返しが行われるようになっており、メッセージウィジェットの方が複数行の文字列の表示に向いています。基本的には、1行の文字列や単語の表示にはラベルウィジェットを利用し、複数行の文字列の表示にはメッセージウィジェットを利用するという使い分けで良いと思います。
ラベルウィジェットの詳細に関しては、下記ページで解説していますので、ラベルウィジェットについて知りたいという方は下記ページを参照していただければと思います。
Tkinterの使い方:ラベルウィジェット(Label)の使い方スポンサーリンク
メッセージボックスとの違い
また、Tkinter では、メッセージウィジェットとは別にメッセージボックスを利用することも可能です。
ただし、メッセージウィジェットの場合は、基本的にアプリのメインウィンドウ上にメッセージを表示したい場合に利用することになります。それに対し、メッセージボックスに関しては、メインウィンドウではなくダイアログを別途表示し、そのダイアログにメッセージを表示したいときに利用することになります。
これらもメッセージを表示するという意味では似ていますが、やはり違いがありますので、目的に応じて使い分けが必要となります。
ちなみに、メッセージボックスに関しては下記ページで解説していますので、メッセージボックスに興味のある方は是非下記ページも読んでみてください。
【Python/Tkinter】メッセージボックスの使い方自動的な折り返し
このメッセージウィジェットの特徴は、表示する文字列に改行が含まれない場合でも、ある程度文字列が長ければ自動的に文字列の折り返しが行われて複数行で表示されるという点になります。
この、メッセージウィジェットの文字列の折り返しは、デフォルト設定の場合、アスペクト比が 1.5
になるように自動的に行われるようになっています。このアスペクト比は、具体的に言えばメッセージウィジェットの高さに対する幅の比になります。つまり、メッセージウィジェットの幅の長さが高さの 1.5
倍程度になるように自動的に文字列の折り返しが行われることになります。
幅が高さのピッタリ 1.5
倍になるというわけではないのですが、ある程度 1.5
倍に近づくように自動的に文字列の折り返しが行われます。
この、アスペクト比は 1.5
から変更可能ですし、アスペクト比ではなく、単純に文字列の幅が特定の長さになった時に自動的に折り返しを行うように設定を変更することも可能です。これらを変更することで、文字列の折り返しが行われる位置も変化することになります。
このあたりの設定の変更の仕方については メッセージウィジェットの設定 で詳細を解説しますが、いずれにせよ、この自動的な文字列の折り返しがメッセージウィジェットの特徴の1つとなりますので、この点については是非覚えておいてください。
メッセージウィジェットの使い方
続いては、メッセージウィジェットの使い方について解説していきたいと思います。
まずは、メッセージウィジェットを利用することで実現できることを理解していただくため、メッセージウィジェットを利用したアプリのスクリプト例を示したいと思います。と言っても、メッセージウィジェットは単に文字列を表示するだけのウィジェットなので、使い方も超簡単で、スクリプト例も非常にシンプルなものになっています。
import tkinter
app = tkinter.Tk()
app.geometry('400x300')
# メッセージウィジェットの作成と配置
message = tkinter.Message(
app,
background='pink',
font=('', 40),
text='TkinterでGUIアプリを開発!',
)
message.pack()
app.mainloop()
このスクリプトを実行すれば、次の図のようなアプリが起動します。
ピンク色背景のウィジェットが、このページで紹介している「メッセージウィジェット」になります。Message
のコンストラクタの text
引数に指定した文字列が、メッセージウィジェット内に表示されていることが確認できると思います。
ポイントは、text
引数に指定した文字列 'TkinterでGUIアプリを開発!'
には改行が含まれていないにもかかわらず、メッセージウィジェット内の文字列が複数行で表示されているという点になります。
複数行で文字列が表示されている理由は、自動的な折り返し で説明した文字列の自動的な折り返しが行われているからで、この折り返しによってアスペクト比、すなわちメッセージウィジェットの高さに対する幅の比が約 1.5
になっていることが確認できると思います。
このように、デフォルト設定の場合、メッセージウィジェットの高さに対する幅の比が約 1.5
となるように自動的に文字列の折り返しが行われるようになっています。
ただし、これも 自動的な折り返し で述べたように、このアスペクト比は 1.5
以外の値にも変更可能です。このあたりは、他の設定も含めて、後述の メッセージウィジェットの設定 で詳細を解説していきます。
スポンサーリンク
メッセージウィジェットの作成
メッセージウィジェットの使い方に関しても、先ほど示したスクリプトを見ていただければ理解していただけると思うのですが、念のため、ここからメッセージウィジェットの使い方について解説しておきます。
まず、メッセージウィジェットを使うためにはメッセージウィジェットの作成が必要となります。
メッセージウィジェットは、tkinter の Message
クラスのコンストラクタを実行することで作成することができます。第1引数には、そのメッセージウィジェットの配置先となるウィジェット(メインウィンドウなど)を指定します。
先ほど示したスクリプトにおいては、下記でメッセージウィジェットの作成を行っています。
message = tkinter.Message(
app,
background='pink',
font=('', 40),
text='TkinterでGUIアプリを開発!',
)
メッセージウィジェットの場合は、文字列を表示することを目的に利用することになるため、コンストラクタ実行時には「表示する文字列」の引数指定が必要となります。
上記では、text
引数で表示する文字列を指定しています。また、text
引数ではなく、textvariable
引数にウィジェット変数を指定して表示する文字列を設定することも可能です。この textvariable
も含めて、Message
クラスのコンストラクタに指定可能な引数は メッセージウィジェットの設定 で紹介します。
メッセージウィジェットの配置
また、他のウィジェット同様に、作成したメッセージウィジェットをアプリ上に表示するためにはウィジェットの配置が必要となります。
この配置に関しては他のウィジェットと同様の手順で実施することが可能で、配置の詳細に関しては下記ページでまとめていますので、詳しく知りたい方は下記ページを参照してください。
Tkinterの使い方:ウィジェットの配置(pack・grid・place)先ほど示したスクリプトにおいては、下記でメッセージウィジェットの配置を行っています。
message.pack()
ここまで説明してきたメッセージウィジェットの作成と配置を行えば、後は mainloop
を実行することでアプリが起動し、作成したメッセージウィジェットがアプリ上に表示されることになります。
メッセージウィジェットの設定
次は、メッセージウィジェットの設定について解説していきます。
他のウィジェット同様に、メッセージウィジェットの見た目等の設定はキーワード引数を指定してコンストラクタ(tkinter.Message()
)や config
メソッドを実行することで変更可能です。これらに指定可能なキーワード引数名は下記により確認することができます。
# message:メッセージウィジェット
print(message.keys())
ここでは、私が動作を理解している設定に対する解説のみを行わせていただきます。具体的には、下記の設定について説明していきます。
- text
- textvariable
- aspect
- width
- font
- justify
- background
- foreground
- borderwidth
- relief
- padx
- pady
- takefocus
- highlightthickness
- highlightcolor
- highlightbackground
- cursor
私の下記環境での実行結果をもとに説明していますが、環境によっては動きが異なるかもしれません
実際にご自身の環境で実行結果を確認していただくと、より確実に設定の効果を理解することができると思います
- OS:Windows 11
- Python:3.12
- Tkinter:8.6
スポンサーリンク
text
text
は、メッセージウィジェットに表示する文字列を設定するキーワード引数です。
text
には文字列を指定します。メッセージウィジェットは文字列を表示すること目的に利用するため、この text
引数、もしくは、次に紹介する textvariable
引数の指定が必要となります。
例えば下記のようにメッセージウィジェットを生成すれば、そのメッセージウィジェットには Hello World
の文字列が表示されることになります。
message = tkinter.Message(
# 略
text='Hello World'
)
textvariable
textvariable
は、メッセージウィジェットに表示する文字列と連動するウィジェット変数を設定するキーワード引数です。
textvariable
には、ウィジェット変数を指定します。メッセージウィジェットには文字列を表示することになりますので、基本的には StringVar
で生成したウィジェット変数を指定することになると思います。
ウィジェット変数に関しては下記ページで詳細を解説していますので、詳しく知りたい方は下記ページを参照してください。
Tkinterの使い方:ウィジェット変数について解説【StringVar・BooleanVar・IntVar・DoubleVar】例えば下記のスクリプトのアプリでは、エントリーウィジェットに入力された文字列がメッセージウィジェットに表示されるようになります。
import tkinter
app = tkinter.Tk()
app.geometry('400x300')
# ウィジェット変数の作成
text_v = tkinter.StringVar()
# メッセージウィジェットの作成と配置
message = tkinter.Message(
app,
background='pink',
font=('', 40),
textvariable=text_v
)
message.pack()
# エントリーウィジェットの作成と配置
entry = tkinter.Entry(
app,
font=('', 40),
textvariable=text_v
)
entry.pack()
app.mainloop()
aspect
aspect
は、メッセージウィジェットの文字列の自動的な折り返しに関する設定を行うキーワード引数です。
この aspect
を指定することで、文字列の自動的な折り返しが行われる際には、メッセージウィジェットの幅と高さが下記のような比率となるように折り返しが実施されるようになります。
幅 : 高さ = aspectの値 : 100
aspect
のデフォルト値は 150
です。つまり、メッセージウィジェットの幅が高さの約 1.5
倍となるように折り返しが実施されるよう設定されています。
例えば下記のようにメッセージウィジェットを生成すれば、文字列の自動的な折り返しが、メッセージウィジェットの幅が高さの約 3
倍となるように実施されるようになります。
message = tkinter.Message(
# 略
aspect=300
)
スポンサーリンク
width
width
も、aspect
同様にメッセージウィジェットの文字列の自動的な折り返しに関する設定を行うキーワード引数です。width
を指定すれば、文字列の横方向の長さが width
で指定された長さよりも大きくなった際に自動的に折り返しが行われるようになります。
width
には整数を指定します。単位はピクセルになります。
width
と aspect
の両方を引数に指定することも可能ですが、この場合は width
が優先されることになり、アスペクト比を考慮した自動的な文字列の折り返しは行われなくなります。つまり、aspect
引数が無視されます。そのため、アスペクト比を考慮した自動的な文字列の折り返しが行われるようにしたいのであれば、width
を指定してはダメということになります。
例えば下記のようにメッセージウィジェットを生成すれば、文字列の自動的な折り返しが、文字列の横方向の長さが 100
ピクセルを超えた際に実施されるようになります。
message = tkinter.Message(
# 略
width=100
)
font
font
は、メッセージウィジェットの文字列のフォントを設定するキーワード引数です。
font
の値としては、tkinter.font.Font
のオブジェクトや、タプル等を指定することが可能です。フォントの指定の仕方に関しては下記ページでまとめていますので、必要に応じて下記ページを参照してください。
例えば下記のようにメッセージウィジェットを生成すれば、そのメッセージウィジェットに表示される文字列のフォントサイズが 40
となります。
message = tkinter.Message(
# 略
font=('', 40)
)
justify
justify
は、メッセージウィジェットに表示される文字列の「揃え」の方向の設定を行うキーワード引数です。複数行の文字列の右揃えや左揃えを設定することができます。
justify
には下記の3つの値を指定可能です。デフォルト値は tkinter.CENTER
となります。
tkinter.CENTER
:中央揃えtkinter.LEFT
:左揃えtkinter.RIGHT
:右揃え
例えば下記のようにメッセージウィジェットを生成すれば、メッセージウィジェットの文字列が改行されていたり折り返しされたりした際には、複数の行の文字列が右揃えされることになります。
message = tkinter.Message(
# 略
justify=tkinter.RIGHT
)
スポンサーリンク
background
background
は、メッセージウィジェットの背景色を設定するキーワード引数です。background
に関しては、略して bg
キーワード引数で指定することも可能です。
background
の値としては、色名やカラーコード等を指定することが可能です。
例えば下記のようにメッセージウィジェットを生成すれば、そのメッセージウィジェット内の背景色がピンク色になります。
message = tkinter.Message(
# 略
background='pink'
)
foreground
foreground
は、メッセージウィジェットに表示する文字列の文字色を設定するキーワード引数です。foreground
に関しては、略して fg
キーワード引数で指定することも可能です。
foreground
の値としては、色名やカラーコード等を指定することが可能です。
例えば下記のようにメッセージウィジェットを生成すれば、そのメッセージウィジェットに表示される文字色が赤色に変化することになります。
message = tkinter.Message(
# 略
foreground='red'
)
borderwidth
borderwidth
は、メッセージウィジェットの外枠の太さを設定するキーワード引数です。
borderwidth
には整数を指定します。単位はピクセルです。
例えば下記のようにメッセージウィジェットを生成すれば、メッセージウィジェットの外枠の幅が 10
ピクセルとなります。
message = tkinter.Message(
# 略
borderwidth=10
)
スポンサーリンク
relief
relief
は、メッセージウィジェットの見た目を設定するキーワード引数です。
relief
に指定可能な値や、それらの値を指定したときのウィジェットの見た目に関しては下記ページで解説していますので、詳しくは下記ページの relief をご参照ください(フレームの例で説明していますが、見た目の変化に関してはメッセージウィジェットにおいても同様になります)。
relief
の指定によってウィジェットの見た目が変化するのは外枠が太い場合です。boarderwidth
に小さい値が指定されていたりデフォルト値のままだったりすると relief
の指定を変更しても見た目が変化しないので注意してください。
例えば下記のようにメッセージウィジェットを生成すれば、そのメッセージウィジェットが浮き上がるような見た目に変化します。
message = tkinter.Message(
# 略
borderwidth=10,
relief=tkinter.RAISED
)
padx
・pady
padx
は、メッセージウィジェットの余白の横幅を指定するキーワード引数、pady
は、メッセージウィジェット内の余白の縦幅を指定するキーワード引数となります。
padx
と pady
には整数を指定します。単位はピクセルです。
例えば下記のようにメッセージウィジェットを生成すれば、そのメッセージウィジェット内の余白の横幅が 10
ピクセル、余白の縦幅が 20
ピクセルとなります。
message = tkinter.Message(
# 略
padx=10,
pady=20
)
takefocus
takefocus
は、メッセージウィジェットへのフォーカスの有効無効を指定するキーワード引数です。
フォーカスが有効なウィジェットは、例えばタブキーの押下によってフォーカスを当てることが可能となります。そして、フォーカスが当たっている場合、例えばボタンであれば、スペースキーの押下でボタンクリックを実施することが可能となります。また、フォーカスが有効なウィジェットがアプリ内に複数存在すれば、タブキーを押すたびに順番にそれらのウィジェットにフォーカスが当てられていくことになります。takefocus=True
を指定することで、メッセージウィジェットもフォーカスが有効になり、フォーカスを当てることが可能となります。
ただし、メッセージウィジェットは文字列を表示するだけなので、フォーカスが当てられるようになったとしても特にメリットは無いと思います…(例えばボタンの場合は、前述の通り、フォーカスが当たっていればキー入力でボタンが押せるようになります)。
takefocus
には Bool 値 (True
/ False
) を指定します。takefocus
のデフォルト値は False
で、メッセージウィジェットのフォーカスは無効となっています。
例えば下記のようにメッセージを生成すれば、そのメッセージウィジェットのフォーカスが有効となり、例えばタブキー押下によってフォーカスを当てることができるようになります。
message = tkinter.Message(
# 略
takefocus=True
)
スポンサーリンク
highlightthickness
highlightthickness
は、フォーカス枠(そのメッセージウィジェットにフォーカスが当たっていることを示す枠)の太さを設定するキーワード引数です。フォーカス枠が存在する場合、メッセージウィジェットにフォーカスが当たっていればフォーカス枠の色が特定の色に変化し、フォーカスが外れればフォーカス枠の色が他の色に変化するようになっています。なので、このフォーカス枠より、そのメッセージウィジェットにフォーカスが当たっているかどうかを判断することができます。
highlightthickness
には 0
以上の整数を指定します。単位はピクセルとなります。デフォルトは、おそらく 0
となります。したがって、フォーカスが当たっていることを視覚的に判断できるようにしたいのであれば、highlightthickness
引数を指定して 1
以上の整数を設定する必要があります。
例えば下記のようにメッセージウィジェットを生成すれば、そのメッセージウィジェットのフォーカス枠の太さが 10
となります。
message = tkinter.Message(
# 略
highlightthickness=10
)
highlightcolor
・highlightbackground
highlightcolor
は、先ほど説明したフォーカス枠における、フォーカスが当たっているときの枠の色を設定するキーワード引数です。それに対し、highlightbackground
は、フォーカスが外れているときの枠の色を指定するキーワード引数となります。
highlightcolor
と highlightbackground
の値としては、色名やカラーコード等を指定することが可能です。
例えば下記のようにメッセージウィジェットを生成すれば、そのメッセージウィジェットにフォーカスが当たっているときはフォーカス枠の色が赤色となり、フォーカスが外れているときはフォーカス枠の色が青色に変化するようになります。
message = tkinter.Message(
# 略
highlightthickness=10,
highlightcolor='red',
highlightbackground='blue'
)
cursor
cursor
は、マウスカーソルをメッセージウィジェット上に移動させたときのカーソルの見た目を設定するキーワード引数です。
cursor
に指定可能な値に関しては、公式の下記ページで紹介されていますので、下記ページを参考にしていただければと思います。
https://tcl.tk/man/tcl8.6/TkCmd/cursors.htm
例えば下記のようにメッセージウィジェットを生成すれば、メッセージウィジェット上にマウスカーソルを合わせたときのカーソルの見た目が「手」に変化します(Windows の場合は)。
message = tkinter.Message(
# 略
cursor='hand1'
)
スポンサーリンク
Message
クラスのメソッド
Message
クラスには Message
クラス特有のメソッドは存在しないため、メソッドの紹介はスキップさせていただきます。
まとめ
このページでは、Tkinter のメッセージウィジェットについて解説しました!
このメッセージウィジェットは、複数行の文字列を表示するウィジェットになります。1行の文字列や単語・タイトル等を表示する場合はラベルウィジェットを使えば良いですが、複数行の文字列を表示するような場合はメッセージウィジェットの方が便利だと思います。
使い方も非常にシンプルなウィジェットになりますので、是非いろんなアプリでメッセージウィジェットを利用してみていただければと思います!
オススメ参考書(PR)
Tkinter に興味がある方には下記のPythonでつくる ゲーム開発 入門講座がオススメです。
Tkinter をゲーム開発を通して「楽しく学ぶ」ことができます。Python 入門者、Tkinter 入門者の方にオススメです。