Tkinterの使い方:メッセージウィジェット(Message)の使い方

このページにはプロモーションが含まれています

このページでは、Tkinter の「メッセージウィジェット」の作成方法・使い方・設定方法等について説明していきたいと思います。

メッセージウィジェットとは

まずは、今回解説する「メッセージウィジェット」がどのようなウィジェットであるのかについて簡単に説明していきます。

メッセージウィジェット=複数行版のラベルウィジェット

メッセージウィジェットは、一言で表せば「複数行バージョンのラベルウィジェット」になります。

メッセージウィジェットも、ラベルウィジェット同様に文字列の表示を行うウィジェットになります。

ただし、基本的にはラベルウィジェットは1行のみの文字列を表示するウィジェットであり、単語やタイトル等の表示に利用されることが多いです。

ラベルウィジェットの説明図

それに対し、メッセージウィジェットは複数行の文字列を表示するウィジェットであり、長文のメッセージ等の表示に利用されることが多いです。

メッセージウィジェットの説明図

補足しておくと、別にラベルウィジェットでも、表示する文字列に改行を入れれば複数行の文字列を表示することは可能です。ただ、メッセージウィジェットでは自動的な文字列の折り返しが行われるようになっており、メッセージウィジェットの方が複数行の文字列の表示に向いています。基本的には、1行の文字列や単語の表示にはラベルウィジェットを利用し、複数行の文字列の表示にはメッセージウィジェットを利用するという使い分けで良いと思います。

ラベルウィジェットとメッセージウィジェットとの使い分けについての説明図

ラベルウィジェットの詳細に関しては、下記ページで解説していますので、ラベルウィジェットについて知りたいという方は下記ページを参照していただければと思います。

ラベルウィジェット解説ページのアイキャッチ Tkinterの使い方:ラベルウィジェット(Label)の使い方

スポンサーリンク

メッセージボックスとの違い

また、Tkinter では、メッセージウィジェットとは別にメッセージボックスを利用することも可能です。

ただし、メッセージウィジェットの場合は、基本的にアプリのメインウィンドウ上にメッセージを表示したい場合に利用することになります。それに対し、メッセージボックスに関しては、メインウィンドウではなくダイアログを別途表示し、そのダイアログにメッセージを表示したいときに利用することになります。

メッセージウィジェットとメッセージボックスとの違いを説明する図

これらもメッセージを表示するという意味では似ていますが、やはり違いがありますので、目的に応じて使い分けが必要となります。

ちなみに、メッセージボックスに関しては下記ページで解説していますので、メッセージボックスに興味のある方は是非下記ページも読んでみてください。

メッセージボックスの使い方の解説ページアイキャッチ 【Python/Tkinter】メッセージボックスの使い方

自動的な折り返し

このメッセージウィジェットの特徴は、表示する文字列に改行が含まれない場合でも、ある程度文字列が長ければ自動的に文字列の折り返しが行われて複数行で表示されるという点になります。

文字列が自動的に折り返しされる様子を示す図

この、メッセージウィジェットの文字列の折り返しは、デフォルト設定の場合、アスペクト比が 1.5 になるように自動的に行われるようになっています。このアスペクト比は、具体的に言えばメッセージウィジェットの高さに対する幅の比になります。つまり、メッセージウィジェットの幅の長さが高さの 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 となるように自動的に文字列の折り返しが行われるようになっています。

ただし、これも 自動的な折り返し で述べたように、このアスペクト比は 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())

ここでは、私が動作を理解している設定に対する解説のみを行わせていただきます。具体的には、下記の設定について説明していきます。

MEMO

私の下記環境での実行結果をもとに説明していますが、環境によっては動きが異なるかもしれません

実際にご自身の環境で実行結果を確認していただくと、より確実に設定の効果を理解することができると思います

  • OS:Windows 11
  • Python:3.12
  • Tkinter:8.6

スポンサーリンク

text

text は、メッセージウィジェットに表示する文字列を設定するキーワード引数です。

text引数の説明図

text には文字列を指定します。メッセージウィジェットは文字列を表示すること目的に利用するため、この text 引数、もしくは、次に紹介する textvariable 引数の指定が必要となります。

例えば下記のようにメッセージウィジェットを生成すれば、そのメッセージウィジェットには Hello World の文字列が表示されることになります。

textの指定例
message = tkinter.Message(
    # 略
    text='Hello World'
)

textvariable

textvariable は、メッセージウィジェットに表示する文字列と連動するウィジェット変数を設定するキーワード引数です。

textvariable引数の説明図

textvariable には、ウィジェット変数を指定します。メッセージウィジェットには文字列を表示することになりますので、基本的には StringVar で生成したウィジェット変数を指定することになると思います。

ウィジェット変数に関しては下記ページで詳細を解説していますので、詳しく知りたい方は下記ページを参照してください。

ウィジェット変数の解説ページのアイキャッチ Tkinterの使い方:ウィジェット変数について解説【StringVar・BooleanVar・IntVar・DoubleVar】

例えば下記のスクリプトのアプリでは、エントリーウィジェットに入力された文字列がメッセージウィジェットに表示されるようになります。

textvariableの指定例
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 を指定することで、文字列の自動的な折り返しが行われる際には、メッセージウィジェットの幅と高さが下記のような比率となるように折り返しが実施されるようになります。

幅 : 高さ = aspectの値 : 100

aspect のデフォルト値は 150 です。つまり、メッセージウィジェットの幅が高さの約 1.5 倍となるように折り返しが実施されるよう設定されています。

例えば下記のようにメッセージウィジェットを生成すれば、文字列の自動的な折り返しが、メッセージウィジェットの幅が高さの約 3 倍となるように実施されるようになります。

aspectの指定例
message = tkinter.Message(
    # 略
    aspect=300
)

スポンサーリンク

width

width も、aspect 同様にメッセージウィジェットの文字列の自動的な折り返しに関する設定を行うキーワード引数です。width を指定すれば、文字列の横方向の長さが width で指定された長さよりも大きくなった際に自動的に折り返しが行われるようになります。

width引数の説明図

width には整数を指定します。単位はピクセルになります。

widthaspect の両方を引数に指定することも可能ですが、この場合は width が優先されることになり、アスペクト比を考慮した自動的な文字列の折り返しは行われなくなります。つまり、aspect 引数が無視されます。そのため、アスペクト比を考慮した自動的な文字列の折り返しが行われるようにしたいのであれば、width を指定してはダメということになります。

例えば下記のようにメッセージウィジェットを生成すれば、文字列の自動的な折り返しが、文字列の横方向の長さが 100 ピクセルを超えた際に実施されるようになります。

widthの指定例
message = tkinter.Message(
    # 略
    width=100
)

font

font は、メッセージウィジェットの文字列のフォントを設定するキーワード引数です。

font引数の説明図

font の値としては、tkinter.font.Font のオブジェクトや、タプル等を指定することが可能です。フォントの指定の仕方に関しては下記ページでまとめていますので、必要に応じて下記ページを参照してください。

フォント指定解説ページのアイキャッチ Tkinterの使い方:フォントの指定方法

例えば下記のようにメッセージウィジェットを生成すれば、そのメッセージウィジェットに表示される文字列のフォントサイズが 40 となります。

fontの指定例
message = tkinter.Message(
    # 略
    font=('', 40)
)

justify

justify は、メッセージウィジェットに表示される文字列の「揃え」の方向の設定を行うキーワード引数です。複数行の文字列の右揃えや左揃えを設定することができます。

justify引数の説明図

justify には下記の3つの値を指定可能です。デフォルト値は tkinter.CENTER となります。

  • tkinter.CENTER:中央揃え
  • tkinter.LEFT:左揃え
  • tkinter.RIGHT:右揃え

例えば下記のようにメッセージウィジェットを生成すれば、メッセージウィジェットの文字列が改行されていたり折り返しされたりした際には、複数の行の文字列が右揃えされることになります。

justifyの指定例
message = tkinter.Message(
    # 略
    justify=tkinter.RIGHT
)

スポンサーリンク

background

background は、メッセージウィジェットの背景色を設定するキーワード引数です。background に関しては、略して bg キーワード引数で指定することも可能です。 

background引数の説明図

background の値としては、色名やカラーコード等を指定することが可能です。

例えば下記のようにメッセージウィジェットを生成すれば、そのメッセージウィジェット内の背景色がピンク色になります。

backgroundの指定例
message = tkinter.Message(
    # 略
    background='pink'
)

foreground

foreground は、メッセージウィジェットに表示する文字列の文字色を設定するキーワード引数です。foreground に関しては、略して fg キーワード引数で指定することも可能です。 

foreground引数の説明図

foreground の値としては、色名やカラーコード等を指定することが可能です。

例えば下記のようにメッセージウィジェットを生成すれば、そのメッセージウィジェットに表示される文字色が赤色に変化することになります。

foregroundの指定例
message = tkinter.Message(
    # 略
    foreground='red'
)

borderwidth

borderwidth は、メッセージウィジェットの外枠の太さを設定するキーワード引数です。

borderwidth引数の説明図

borderwidth には整数を指定します。単位はピクセルです。

例えば下記のようにメッセージウィジェットを生成すれば、メッセージウィジェットの外枠の幅が 10 ピクセルとなります。

borderwidthの指定例
message = tkinter.Message(
    # 略
    borderwidth=10
)

スポンサーリンク

relief

relief は、メッセージウィジェットの見た目を設定するキーワード引数です。

relief引数の説明図

relief に指定可能な値や、それらの値を指定したときのウィジェットの見た目に関しては下記ページで解説していますので、詳しくは下記ページの relief をご参照ください(フレームの例で説明していますが、見た目の変化に関してはメッセージウィジェットにおいても同様になります)。

フレームウィジェットの作り方の解説ページアイキャッチ Tkinterの使い方:フレームウィジェット(Frame)の使い方

relief の指定によってウィジェットの見た目が変化するのは外枠が太い場合です。boarderwidth に小さい値が指定されていたりデフォルト値のままだったりすると relief の指定を変更しても見た目が変化しないので注意してください。

例えば下記のようにメッセージウィジェットを生成すれば、そのメッセージウィジェットが浮き上がるような見た目に変化します。

reliefの指定例
message = tkinter.Message(
    # 略
    borderwidth=10,
    relief=tkinter.RAISED
)

padxpady

padx は、メッセージウィジェットの余白の横幅を指定するキーワード引数、pady は、メッセージウィジェット内の余白の縦幅を指定するキーワード引数となります。

pad引数とpady引数の説明図

padxpady には整数を指定します。単位はピクセルです。

例えば下記のようにメッセージウィジェットを生成すれば、そのメッセージウィジェット内の余白の横幅が 10 ピクセル、余白の縦幅が 20 ピクセルとなります。

padxとpadyの指定例
message = tkinter.Message(
    # 略
    padx=10,
    pady=20
)

takefocus

takefocus は、メッセージウィジェットへのフォーカスの有効無効を指定するキーワード引数です。

フォーカスが有効なウィジェットは、例えばタブキーの押下によってフォーカスを当てることが可能となります。そして、フォーカスが当たっている場合、例えばボタンであれば、スペースキーの押下でボタンクリックを実施することが可能となります。また、フォーカスが有効なウィジェットがアプリ内に複数存在すれば、タブキーを押すたびに順番にそれらのウィジェットにフォーカスが当てられていくことになります。takefocus=True を指定することで、メッセージウィジェットもフォーカスが有効になり、フォーカスを当てることが可能となります。

takefocus引数の説明図

ただし、メッセージウィジェットは文字列を表示するだけなので、フォーカスが当てられるようになったとしても特にメリットは無いと思います…(例えばボタンの場合は、前述の通り、フォーカスが当たっていればキー入力でボタンが押せるようになります)。

takefocus には Bool 値 (True / False) を指定します。takefocus のデフォルト値は False で、メッセージウィジェットのフォーカスは無効となっています。

例えば下記のようにメッセージを生成すれば、そのメッセージウィジェットのフォーカスが有効となり、例えばタブキー押下によってフォーカスを当てることができるようになります。

takefocusの指定例
message = tkinter.Message(
    # 略
    takefocus=True
)

スポンサーリンク

highlightthickness

highlightthickness は、フォーカス枠(そのメッセージウィジェットにフォーカスが当たっていることを示す枠)の太さを設定するキーワード引数です。フォーカス枠が存在する場合、メッセージウィジェットにフォーカスが当たっていればフォーカス枠の色が特定の色に変化し、フォーカスが外れればフォーカス枠の色が他の色に変化するようになっています。なので、このフォーカス枠より、そのメッセージウィジェットにフォーカスが当たっているかどうかを判断することができます。

highlightthickness引数の説明図

highlightthickness には 0 以上の整数を指定します。単位はピクセルとなります。デフォルトは、おそらく 0 となります。したがって、フォーカスが当たっていることを視覚的に判断できるようにしたいのであれば、highlightthickness 引数を指定して 1 以上の整数を設定する必要があります。

例えば下記のようにメッセージウィジェットを生成すれば、そのメッセージウィジェットのフォーカス枠の太さが 10 となります。

highlightthicknessの指定例
message = tkinter.Message(
    # 略
    highlightthickness=10
)

highlightcolorhighlightbackground

highlightcolor は、先ほど説明したフォーカス枠における、フォーカスが当たっているときの枠の色を設定するキーワード引数です。それに対し、highlightbackground は、フォーカスが外れているときの枠の色を指定するキーワード引数となります。

highlightcolor引数とhighlightbackground引数の説明図

highlightcolorhighlightbackground の値としては、色名やカラーコード等を指定することが可能です。

例えば下記のようにメッセージウィジェットを生成すれば、そのメッセージウィジェットにフォーカスが当たっているときはフォーカス枠の色が赤色となり、フォーカスが外れているときはフォーカス枠の色が青色に変化するようになります。

highlightcolorとhighlightbackgroundの指定例
message = tkinter.Message(
    # 略
    highlightthickness=10,
    highlightcolor='red',
    highlightbackground='blue'
)

cursor

cursor は、マウスカーソルをメッセージウィジェット上に移動させたときのカーソルの見た目を設定するキーワード引数です。

cursor引数の説明図

cursor に指定可能な値に関しては、公式の下記ページで紹介されていますので、下記ページを参考にしていただければと思います。

https://tcl.tk/man/tcl8.6/TkCmd/cursors.htm

例えば下記のようにメッセージウィジェットを生成すれば、メッセージウィジェット上にマウスカーソルを合わせたときのカーソルの見た目が「手」に変化します(Windows の場合は)。

cursorの指定例
message = tkinter.Message(
    # 略
    cursor='hand1'
)

スポンサーリンク

Message クラスのメソッド

Message クラスには Message クラス特有のメソッドは存在しないため、メソッドの紹介はスキップさせていただきます。

まとめ

このページでは、Tkinter のメッセージウィジェットについて解説しました!

このメッセージウィジェットは、複数行の文字列を表示するウィジェットになります。1行の文字列や単語・タイトル等を表示する場合はラベルウィジェットを使えば良いですが、複数行の文字列を表示するような場合はメッセージウィジェットの方が便利だと思います。

使い方も非常にシンプルなウィジェットになりますので、是非いろんなアプリでメッセージウィジェットを利用してみていただければと思います!

オススメ参考書(PR)

Tkinter に興味がある方には下記のPythonでつくる ゲーム開発 入門講座がオススメです。

Tkinter をゲーム開発を通して「楽しく学ぶ」ことができます。Python 入門者、Tkinter 入門者の方にオススメです。

同じカテゴリのページ一覧を表示