このページでは、Tkinter の「メニューボタンウィジェット」の作成方法・使い方・設定方法等について説明していきたいと思います。
メニューボタンウィジェットとは
まずは、今回解説する「メニューボタンウィジェット」がどのようなウィジェットであるのかについて簡単に説明していきます。
メニューボタンウィジェット
メニューボタンウィジェットは、名前の通り、メニューを表示するボタンになります。
通常、メニューを表示するボタンはメニューバーに存在しますが、メニューボタンウィジェットを利用することで、メニューを表示するボタンをアプリ内の任意の位置に設置することが可能となります。
例えば Windows の場合はメニューバーがアプリの上部に存在し、このメニューバーのボタン(項目)をクリックすることでメニューを表示することができるようになっています。
また、Mac の場合は PC のデスクトップの上部にメニューバーが存在し、このメニューバーのボタン(項目)をクリックすることでメニューを表示することができるようになっています。
このように、メニューの表示はメニューバーのボタンをクリックすることで実施できるようになっています。ただし、メニューバーの位置は OS 等によって決まっているため、メニューを表示するボタンの位置は固定ということになります。
また、Tkinter においても、下記ページで解説している通り、メニューの表示をメニューウィジェットを利用して実現することが可能です。ただし、このメニューウィジェットで作成したメニューも基本的にはメニューバーに表示されることになります。なので、メニューウィジェットを利用した場合も、メニューを表示するボタンの位置は固定ということになります。
Tkinterの使い方:メニュー(Menu)の使い方それに対し、メニューボタンウィジェットを利用すれば、開発者が好きな位置にメニューを表示するボタンを設置することが可能となります。そして、通常のメニューのように、そのボタンをクリックすれば、プルダウンメニューとしてメニューが表示されることになります。
スポンサーリンク
メニューウィジェットとの違い
先ほども説明したように、メニューウィジェットもメニューボタンウィジェットも「メニューを表示するボタンのウィジェット」となります。
ですが、メニューウィジェットの場合は、そのボタンはメニューバーに設置されます。それに対し、メニューボタンウィジェットの場合は、ボタンを開発者が任意の位置に設置することが可能です。この点が、メニューウィジェットとメニューボタンウィジェットの一番大きな違いとなります。
表示メニューの設定
ただし、メニューウィジェットもメニューボタンウィジェットも共通して「メニューを表示するボタンのウィジェット」であるため、クリック時に表示されるメニューの設定方法等は非常に似ています。
表示メニューの設定方法
例えば、メニューバーに表示するメニューは、「menu
引数にメニューグループを指定した config
メソッド」をアプリ(メインウィンドウ)に実行させることで設定可能です。
import tkinter
app = tkinter.Tk()
# メニューグループの作成
# メニューバーの表示メニューの設定
app.config(menu=メニューグループ)
app.mainloop()
それに対し、メニューボタンウィジェットがクリックされた時に表示するメニューは、「menu
引数にメニューグループを指定した config
メソッド」をメニューボタンウィジェットに実行させることで設定可能です。
import tkinter
app = tkinter.Tk()
# メニューボタンウィジェットを作成
menu_button = tkinter.Menubutton(app)
menu.pack()
# メニューグループの作成
# ボタンクリック時の表示メニューの設定
menu_button.config(menu=メニューグループ)
app.mainloop()
このように、表示されるメニューの設定方法に関しては、メニューバーで表示するメニューを設定する時と、メニューボタンウィジェットで表示するメニューを設定する時とでほとんど同じとなります。
表示されるメニューグループの作成も必要
で、ポイントは、メニューの表示時にはメニューグループの作成が必要になるという点になります。メニューグループとは、メニューウィジェットそのものになります。つまり、メニューボタンウィジェットを利用するためには、メニューボタンウィジェットだけでなくメニューウィジェットの作成も必要となります。
さらに、メニューグループ(メニューウィジェット)は作成した段階では空となるため、メニューグループにメソッドを実行させてメニューに表示したいアイテムを追加していく必要があります。
そして、このようにして作成したメニューグループを config
メソッドを利用してメニューボタンウィジェットに対して設定することで、初めて「クリックするとメニューが表示されるメニューボタンウィジェット」が実現できることになります。
ということで、メニューボタンウィジェットを使いこなすためには、メニューウィジェットの作り方や使い方についても理解しておく必要があります。
このページは、あくまでもメニューボタンウィジェットの解説を行うページですので、基本的にはメニューウィジェットに関する説明は省略させていただきます。メニューウィジェットの解説ページは下記で公開していますので、メニューウィジェットの使い方や設定方法等について知りたい方は下記ページを参照してください。
Tkinterの使い方:メニュー(Menu)の使い方メニューボタンウィジェットの見た目
また、メニューボタンウィジェットの見た目は Windows の場合と Mac の場合とで大きく異なります。
Windows の場合は下の図のようなボタンとなります。点線でボタンを囲っていますが、実際には点線も存在せず、デフォルト設定だと背景に溶け込んだような見た目となります(ボタン名のみが表示される)。
それに対し、Mac の場合は下の図のようなウィジェットとなります。
このページでは、ボタンであることを理解してもらうために下の図のようなボタンの絵で解説を進めますが、上記で示したように、実際の見た目とは異なるので注意してください。また、以降でスクショを示す際には、Windows で撮影したものを示すようにしていきます。
スポンサーリンク
重要性は低い?
おそらく、ここまでの説明を読めば、メニューボタンウィジェットがどんなウィジェットであるのかについては理解していただけたのではないかと思います。と同時に「こんなウィジェットどこで使うの?」という疑問が湧いてきたのではないでしょうか?
正直言うと、私もこのウィジェットの使いどころは理解していません…。というか、このウィジェットを利用する機会は少ないのではないかと思います。メニューはメニューバーで表示すればよいですし…。
なので、他のウィジェットに比べて、このウィジェットの重要性は低いと思います。とりあえず、メニューボタンウィジェットの正体を理解して満足された方・使いどころがないと判断された方は、ブラウザバックしていただいても良いと思います。もし、メニューボタンウィジェットを使う必要が出てきた際に、再度このページに戻ってきていただければ幸いです。
メニューボタンウィジェットの使い方
ということで、重要性は低いウィジェットではありますが、解説は続けたいと思います。
次は、メニューボタンウィジェットの使い方について解説していきたいと思います。
まずは、メニューボタンウィジェットを利用することで実現できることを理解していただくため、メニューボタンウィジェットを利用した簡単なアプリのスクリプト例を示したいと思います。
import tkinter
def file_open():
print('file_open')
def file_save():
print('file_save')
app = tkinter.Tk()
app.geometry('300x200')
# メニューボタンウィジェットの作成
menu_button = tkinter.Menubutton(
app,
text='ファイル',
height=2,
width=10
)
# メニューボタンウィジェットの配置
menu_button.place(
relx=0.5,
rely=0.5,
anchor=tkinter.CENTER
)
# メニューグループの作成
file_menu = tkinter.Menu(
menu_button,
tearoff=False,
)
file_menu.add_command(label='開く', command=file_open)
file_menu.add_command(label='保存', command=file_save)
# ボタンクリック時の表示メニューの設定
menu_button.config(menu=file_menu)
# メインループ
app.mainloop()
このスクリプトを実行すれば、次の図のようなアプリが起動します。
真ん中に表示されている ファイル
部分がメニューボタンウィジェットになります。これをクリックすれば、メニューボタンウィジェットの下側に 開く
と 保存
のアイテムを持つメニューが表示されることが確認できると思います。ちょうど、メニューバーのメニューをクリックしたときと同様のメニュー表示が実現できていることが確認できると思います。
今回は、メニューボタンウィジェットの簡単な利用例となりますので、これらの 開く
と 保存
をクリックしても単に標準出力に文字列が出力されるだけになりますが、これらがクリックされた時にファイル選択ダイアログを表示するようにすれば、皆さんがいつも利用しているアプリのメニューバーのメニューのような動作を実現できることがイメージできるのではないかと思います。
このファイル選択ダイアログの表示に関しては別途下記ページで解説していますので、興味があれば読んでみてください。
Python でファイル選択画面を表示するこんな感じで、メニューバーのメニュー表示をボタンで実現するのがメニューボタンウィジェットとなります。
メニューボタンウィジェットの作成
次は、メニューボタンウィジェットの使い方の手順を説明していきます。
まず、メニューボタンウィジェットを使うためにはメニューボタンウィジェットの作成が必要となります。
メニューボタンウィジェットは、Tkinter の Menubutton
クラスのコンストラクタを実行することで作成することができます。第1引数には、そのメニューボタンウィジェットの配置先となるウィジェット(メインウィンドウなど)を指定します。
# app はメインウィンドウ等の親ウィジェット
menu_button = tkinter.Menubutton(
app,
text='ファイル',
height=2,
width=10
)
メニューボタンウィジェットの場合は、コンストラクタ実行時に必須となるのは第1引数(配置先ウィジェット)のみです。ただし、ボタンに表示される文字列(ボタン名)を設定するために text
引数も指定しておいた方が良いと思います。あとは、メニューボタンウィジェットに表示される文字列のフォントを変更したい場合は font
引数、メニューボタンウィジェットの幅や高さを調整したい場合は width
引数や height
引数の指定も必要となります。
これらの引数については、メニューボタンウィジェットの設定 で詳細を説明していきます。
スポンサーリンク
メニューボタンウィジェットの配置
また、他のウィジェット同様に、作成したメニューボタンウィジェットをアプリ上に表示するためにはウィジェットの配置が必要となります。
このメニューボタンウィジェットの特徴は、メニューを表示するボタンを好きな位置に配置できるという点にあります。なので、下記ページで紹介している pack
・grid
・place
メソッドを利用して、あなたの好きな位置にメニューボタンウィジェットを配置するようにしましょう。
先ほど示したスクリプトにおいては、下記でメニューボタンウィジェットの配置を行っています。アプリのウィンドウの真ん中に表示されるように place
メソッドを利用して配置しています。別に place
ではなく、pack
や grid
メソッドで配置しても良いです。重要なことは、意図した位置にウィジェットを配置できるようにメソッドを使い分けることです。
menu_button.place(
relx=0.5,
rely=0.5,
anchor=tkinter.CENTER
)
メニューグループの作成
ここまで説明してきたメニューボタンウィジェットの作成と配置を行えば、後は mainloop
を実行することでアプリが起動し、作成したメニューボタンウィジェットがアプリ上に表示されることになります。
ただ、現状では、作成したメニューボタンウィジェットに表示メニューを設定していないため、アプリに表示されるメニューボタンウィジェットをクリックしても何も表示されないことになります。
前述の通り、メニューボタンウィジェットのクリック時に表示するメニューを設定するためには、まずはメニューグループを作成する必要があります。
作成
メニューグループとはメニューウィジェットのことですので、メニューグループは Tkinter の Menu
クラスのコンストラクタを実行することで作成することが可能です。ここで重要になるのは、作成するメニューグループをメニューボタンウィジェットクリック時に表示するメニューグループとするためには、Menu
クラスのコンストラクタの第1引数に、そのメニューボタンウィジェットを指定する必要があるという点になります。
そのため、先ほど示したスクリプトにおいては、Menu
の第1引数に menu_button
を指定するようにしています。この menu_button
は事前に作成したメニューボタンウィジェットとなります。
file_menu = tkinter.Menu(
menu_button,
tearoff=False,
)
この点さえ満たせば、後は通常のメニューグループと同様の引数指定等でメニューグループを作成してやれば良いです。Menu
のコンストラクタに指定可能な引数に関しては、前述でも紹介した下記ページで解説していますので、詳細に関しては下記ページを参照してください。
要素の追加
さらに、メニューグループは作成しただけでは意味がなく、そのメニューグループにメニューアイテム等の要素を追加する必要があります。
この要素の追加に関しても、先ほど説明したメニューウィジェットのページで解説していますので、詳しくはそちらを参照していただければと思います。
先ほどした紹介スクリプトにおいては、下記部分で add_command
によってメニューアイテムの追加を実施しています。
file_menu.add_command(label='開く', command=file_open)
file_menu.add_command(label='保存', command=file_save)
具体的には、下記の2つのメニューアイテムの追加を行っています。
- 1つ目のメニューアイテム
- 表示名:
開く
- クリックされた際に実行する関数:
file_open
- 表示名:
- 2つ目のメニューアイテム
- 表示名:
保存
- クリックされた際に実行する関数:
file_save
- 表示名:
メニューボタンウィジェットへの表示メニューの設定
メニューボタンウィジェットとメニューグループが作成できれば、後はメニューボタンウィジェットの表示メニューとして作成したメニュグループを設定してやれば完成です。
メニューボタンウィジェットの表示メニューの設定は、メニューボタンウィジェットに下記のようにキーワード引数を指定して config
メソッドを実行させることで実施できます。
- キー名:
menu
- 値:作成済みのメニューグループ
先ほど示したスクリプトにおいては、下記部分で表示メニューの設定を行っています。
menu_button.config(menu=file_menu)
あとは、いつも通り mainloop
を実行すれば、アプリが起動してメニューボタンウィジェットが表示されることになります。そして、そのメニューボタンウィジェットをクリックすれば、表示メニューとして設定されたメニューグループが表示されることになります。
スポンサーリンク
メニューボタンウィジェットの設定
続いて、メニューボタンウィジェットの設定について解説していきます。
他のウィジェット同様に、メニューボタンウィジェットの見た目等の設定はキーワード引数を指定してコンストラクタ(tkinter.Menubutton()
)や config
メソッドを実行することで変更可能です。これらに指定可能なキーワード引数名は下記により確認することができます。
# menu_button:メニューボタンウィジェット
print(menu_button.keys())
ここからメニューボタンウィジェットの設定について解説していきますが、メニューボタンウィジェットの設定は、あくまでもボタンに対する設定であるという点に注意してください。ボタンクリック時に表示されるメニューの設定に関しては、メニューグループ(メニューウィジェット)に対する設定で変更する必要があります。
メニューグループの設定に関しては下記ページで解説していますので、メニューグループ側の設定を変更したい場合は下記ページを参照してください。
Tkinterの使い方:メニュー(Menu)の使い方また、ここでは、具体的には下記の設定について説明していきます。
- menu
- direction
- text
- textvariable
- font
- underline
- width
- height
- background
- foreground
- borderwidth
- relief
- state
- anchor
- padx
- pady
- activebackground
- activeforeground
- disabledforeground
- takefocus
- highlightthickness
- highlightcolor
- highlightbackground
- wraplength
- justify
- image
- compound
- cursor
- indicatoron
ただし、Mac においては、基本的な設定となる menu
や direction
、text
等の設定は可能なのですが、特に色やサイズに関する設定を行うとメニューボタンウィジェットの見た目が変になることが多かったため、基本的には Mac 向けのアプリ開発時には色やサイズに関する設定は行わないことをオススメします。例えば、下図は実際に font
・background
・height
を設定したときのメニューボタンウィジェットであり、ボタンの外側に背景色や文字がはみ出てしまい、意図したとおりの見た目に設定できませんでした。
とりあえず、Mac で動作確認をしていて見た目がおかしくなるような場合は、その設定は採用しないことをオススメします。
私の下記環境での実行結果をもとに説明していますが、環境によっては動きが異なるかもしれません
実際にご自身の環境で実行結果を確認していただくと、より確実に設定の効果を理解することができると思います
- OS:Windows 11
- Python:3.12
- Tkinter:8.6
ここまでの解説の中でも説明したように、menu
は、メニューボタンウィジェットがクリックされた際に表示するメニューグループを設定するキーワード引数です。
menu
には、メニューウィジェット(Menu
のインスタンス)を指定します。
この menu
は、Menubutton
のコンストラクタの引数にも指定可能ではあるのですが、基本的にはコンストラクタの引数には指定せず、メニューボタンウィジェットの使い方 で示したスクリプトのように、ウィジェット作成後に config
メソッドを利用して menu
の設定を行うことになります。その理由は、メニューボタンウィジェット作成前に、表示メニューに設定するメニューグループの作成ができないからです。
メニューグループを作成する時に実行するコンストラクタの引数にはメニューボタンウィジェットを指定する必要があります。なので、先にメニューボタンウィジェットを作成し、その後にメニューグループを作成する必要があります。つまり、メニューボタンウィジェット作成時には、その表示メニューとするメニューグループは存在しないことになります。なので、メニューボタンウィジェット作成時に表示メニューを設定することは不可です。
そのため、まずメニューボタンウィジェットを menu
の設定なしに作成し、そのメニューボタンウィジェットを引数に指定してメニューグループを作成した後、config
メソッドを利用して menu
の設定を行う必要があります。
例えば下記のような処理を実行してメニューボタンウィジェットの設定を行えば、メニューボタンウィジェットをクリックした際に、開く
と 保存
のメニューアイテムを持つメニューグループが表示されるようになります。
# メニューボタンウィジェットの作成
menu_button = tkinter.Menubutton(
# 略
)
# メニューグループの作成
menu = tkinter.Menu(
menu_button,
# 略
)
menu.add_command(label='開く')
menu.add_command(label='保存')
# 表示メニューへの設定
menu_button.config(menu=menu)
direction
text
は、クリック時に表示されるメニューの表示位置を設定するキーワード引数です。
direction
には、下記の5種類の値が指定可能です。デフォルトは 'below'
になります。ちなみに、'flush'
に関しては Windows の場合は指定しても効果なしでした…。
'above'
:メニューをメニューボタンウィジェットの上側に表示'below'
:メニューをメニューボタンウィジェットの下側に表示'left'
:メニューをメニューボタンウィジェットの左側に表示'right'
:メニューをメニューボタンウィジェットの右側に表示'flush'
:メニューをメニューボタンウィジェットと重ねて表示
例えば下記のようにメニューボタンウィジェットを生成すれば、そのメニューボタンウィジェットをクリックした時にメニューがメニューボタンウィジェットの上側に表示されようになります。
menu_button = tkinter.Menubutton(
# 略
direction='above'
)
スポンサーリンク
text
text
は、メニューボタンウィジェットに表示するボタン名を設定するキーワード引数です。
text
には、文字列を指定します。
例えば下記のようにメニューボタンウィジェットを生成すれば、そのメニューボタンウィジェットのボタン名が Menu
と表示されることになります。
menu_button = tkinter.Menubutton(
# 略
text='Menu'
)
textvariable
textvariable
は、メニューボタンウィジェットに表示するボタン名と連動するウィジェット変数を設定するキーワード引数です。
textvariable
には、ウィジェット変数を指定します。ボタン名と連動するウィジェット変数となりますので、StringVar
で生成したウィジェット変数を指定することになると思います。
ウィジェット変数に関しては下記ページで詳細を解説していますので、詳しく知りたい方は下記ページを参照してください。
Tkinterの使い方:ウィジェット変数について解説【StringVar・BooleanVar・IntVar・DoubleVar】例えば下記のスクリプトのアプリでは、エントリーウィジェットに入力された文字列が、メニューボタンウィジェットのボタン名として表示されるようになります(メニューグループを作成していないので、メニューボタンウィジェットをクリックしてもメニューは表示されません)。
import tkinter
app = tkinter.Tk()
app.geometry('300x200')
# ウィジェット変数の作成
button_name = tkinter.StringVar(value='Button')
# メニューボタンウィジェットの作成
menu_button = tkinter.Menubutton(
app,
textvariable=button_name,
)
# メニューボタンウィジェットの配置
menu_button.pack(padx=10, pady=10)
# ボタン名入力用エントリーの作成と配置
entry = tkinter.Entry(
app,
textvariable=button_name
)
entry.pack(padx=10, pady=10)
# メインループ
app.mainloop()
font
font
は、メニューボタンウィジェットのボタン名のフォントを設定するキーワード引数です。
font
の値としては、tkinter.font.Font
のオブジェクトや、タプル等を指定することが可能です。フォントの指定の仕方に関しては下記ページでまとめていますので、必要に応じて下記ページを参照してください。
例えば下記のようにメニューボタンウィジェットを生成すれば、そのメニューボタンウィジェットのボタン名のフォントサイズが 40
に変化することになります。
menu_button = tkinter.Menubutton(
# 略
font=('', 40)
)
スポンサーリンク
underline
underline
は、メニューボタンウィジェットのボタン名の特定の文字に下線を追加するキーワード引数です。
underline
には文字の位置を整数で指定します。これにより、underline
に指定した位置の文字に下線が追加されます。underline
に負の値や、文字数を超える値を指定した場合は下線が追加されないことになります。underline
のデフォルト値は -1
です。
例えば下記のようにメニューボタンウィジェットを生成すれば、そのメニューボタンウィジェットのボタン名の先頭の文字(B
)に下線が追加されることになります。
menu_button = tkinter.Menubutton(
# 略
text='Button',
underline=0
)
width
width
は、メニューボタンウィジェットの幅を指定するキーワード引数です。
width
には、文字数を整数で指定します。これにより、その文字数分の文字幅にメニューボタンウィジェットの幅が設定されます。ただし、基本的に半角文字をベースにウィジェットの幅が設定されるようになっているため、ボタン名に全角文字が含まれる場合は、文字数よりも大きめの値を指定することをオススメします。
例えば下記のようにメニューボタンウィジェットを生成すれば、そのメニューボタンウィジェットが 10
文字分の幅に設定されます。
text= tkinter.Menubutton(
# 略
width=10
)
height
height
は、メニューボタンウィジェットの高さを指定するキーワード引数です。
height
には、width
と同様に文字数を整数で指定します。これにより、その文字数分の文字が縦方向に収まるようにメニューボタンウィジェットの高さが設定されます。
例えば下記のようにメニューボタンウィジェットを生成すれば、そのメニューボタンウィジェットが 10
文字分の高さに設定されます。
menu_button = tkinter.Menubutton(
# 略
height=10
)
スポンサーリンク
background
background
は、メニューボタンウィジェットの背景色を設定するキーワード引数です。background
に関しては、略して bg
キーワード引数で指定することも可能です。
background
の値としては、色名やカラーコード等を指定することが可能です。
例えば下記のようにメニューボタンウィジェットを生成すれば、そのメニューボタンウィジェットの背景色が赤色に変化することになります。
menu_button = tkinter.Menubutton(
# 略
background='red'
)
foreground
foreground
は、メニューボタンウィジェットのボタン名の文字色を設定するキーワード引数です。foreground
に関しては、略して fg
キーワード引数で指定することも可能です。
foreground
の値としては、色名やカラーコード等を指定することが可能です。
例えば下記のようにメニューボタンウィジェットを生成すれば、そのメニューボタンウィジェットのボタン名の文字色が青色に変化することになります。
menu_button = tkinter.Menubutton(
# 略
foreground='blue'
)
borderwidth
borderwidth
は、メニューボタンウィジェットの外枠の太さを設定するキーワード引数です。
borderwidth
には整数を指定します。単位はピクセルです。
少なくとも Windows の場合は、次に説明する relief
のデフォルトが tkinter.FLAT
になっており、この場合は外枠の太さを変化させてもそれが見た目では分からないようになっているので注意してください。borderwidth
への指定値によって外枠が変化する様子を確認したいのであれば、relief
に tkinter.FLAT
以外を指定してください。
例えば下記のようにメニューボタンウィジェットを生成すれば、メニューボタンウィジェットの外枠の幅が 10
ピクセルに変化します。
menu_button = tkinter.Menubutton(
# 略
borderwidth=10
)
スポンサーリンク
relief
relief
は、メニューボタンウィジェットの見た目を設定するキーワード引数です。
relief
に指定可能な値や、それらの値を指定したときのウィジェットの見た目に関しては下記ページで解説していますので、詳しくは下記ページの relief をご参照ください(フレームの例で説明していますが、見た目の変化に関してはメニューボタンウィジェットにおいても同様になります)。
relief
の指定によってウィジェットの見た目が変化するのは外枠が太い場合です。boarderwidth
に 0
が指定されていると relief
の指定を変更しても見た目が変化しないので注意してください。
例えば下記のようにメニューボタンウィジェットを生成すれば、そのメニューボタンウィジェットが浮き上がるような見た目に変化します。
menu_button = tkinter.Menubutton(
# 略
borderwidth=10,
relief=tkinter.RAISED
)
state
state
は、メニューボタンウィジェットの状態を設定するキーワード引数です。
state
には下記の3つの値が指定可能です。デフォルトは tkinter.NORMAL
となります。また、tkinter.DISABLED
を指定して無効化すると、そのメニューボタンウィジェットのクリックが不可となります。
tkinter.NORMAL
:有効化tkinter.ACTIVE
:有効化?tkinter.DISABLED
:無効化
例えば下記のようにメニューボタンウィジェットを生成すれば、そのメニューボタンウィジェットのクリックが不可となります。
menu_button = tkinter.Menubutton(
# 略
state=tkinter.DISABLED
)
anchor
anchor
は、メニューボタンウィジェットのボタン名の表示位置を設定するキーワード引数です。
特に、この設定の変更の効果が分かりやすいのは、メニューボタンウィジェットに対してボタン名が小さい場合、より具体的に言えば、width
と height
に大きな値が設定されている場合となります。
anchor
には下記の9種類の値が指定可能です。それぞれを指定したときのボタン名の表示位置も下記の通りとなります。デフォルトは tkinter.CENTER
です。
tkinter.N
:上側に表示tkinter.E
:右側に表示tkinter.S
:下側に表示tkinter.W
:左側に表示tkinter.NE
:右上側に表示tkinter.NW
:左下側に表示tkinter.SE
:右下側に表示tkinter.SW
:左下側に表示tkinter.CENTER
:中心に表示
ちなみに、N
は North (北)・S
は South (南)・E
は East (東)・W
は West (西) をそれぞれ表していますので、東西南北の関係で考えると、各指定値でどの方向にボタン名が表示されるのかをイメージしやすくなると思います。
例えば下記のようにメニューボタンウィジェットを生成すれば、そのメニューボタンウィジェットのボタン名が右下に表示されるようになります。
menu_button = tkinter.Menubutton(
# 略
anchor=tkinter.SE
)
スポンサーリンク
padx
・pady
padx
は、メニューボタンウィジェット内の余白の横幅を指定するキーワード引数、pady
は、メニューボタンウィジェット内の余白の縦幅を指定するキーワード引数となります。
padx
と pady
には整数を指定します。単位はピクセルです。
この padx
と pady
は、基本的には先ほど説明した anchor
とセットで指定する必要があります。anchor
のみの指定の場合、例えば左上や右下といった、特定の方向の隅にボタン名が表示されることになります。padx
と pady
を指定すれば、隅ではなく余白を空けた位置にボタン名を表示することができるようになります。
例えば anchor
に tkinter.NW
を指定している場合は、上の図のようにメニューボタンウィジェットの左上隅から横方向に padx
ピクセル、縦方向に pady
ピクセルの余白を空けた位置にボタン名が表示されることになります。
あくまでも、padx
と pady
は、ボタン名を特定の方向の隅から余白を空けてボタン名を表示するための引数であり、ボタン名を中心に表示する anchor=tkinter.CENTER
を指定している場合や anchor
を指定していない場合は効果が出ないので注意してください。
例えば下記のようにメニューボタンウィジェットを生成すれば、メニューボタンウィジェットの右下隅から横方向に 10
ピクセル、縦方向に 20
ピクセルの余白を空けた位置にボタン名が表示されることになります。
menu_button = tkinter.Menubutton(
# 略
padx=10,
pady=20,
anchor=tkinter.SE
)
activebackground
activebackground
は、メニューボタンウィジェット上にマウスカーソルが存在する場合のメニューボタンウィジェットの背景色を設定するキーワード引数です。
activebackground
の値としては、色名やカラーコード等を指定することが可能です。
例えば下記のようにメニューボタンウィジェットを生成すれば、メニューボタンウィジェット上にマウスカーソルが存在する場合のメニューボタンウィジェットの背景色が緑色になります。
menu_button = tkinter.Menubutton(
# 略
activebackground='green'
)
activeforeground
activeforeground
は、メニューボタンウィジェット上にマウスカーソルが存在する場合のメニューボタンウィジェットの文字色を設定するキーワード引数です。
activeforeground
の値としては、色名やカラーコード等を指定することが可能です。
例えば下記のようにメニューボタンウィジェットを生成すれば、メニューボタンウィジェット上にマウスカーソルが存在する場合のメニューボタンウィジェットの文字色がオレンジ色になります。
menu_button = tkinter.Menubutton(
# 略
activeforeground='orange'
)
スポンサーリンク
disabledforeground
disabledforeground
は、無効状態のメニューボタンウィジェットの文字色を設定するキーワード引数です。state で説明したように、state=tkinter.DISABLED
を指定することで、メニューボタンウィジェットを無効化することができます。そして、その時の文字色を指定するのが、この disabledforeground
となります。
disabledforeground
の値としては、色名やカラーコード等を指定することが可能です。
例えば下記のようにメニューボタンウィジェットを生成すれば、無効状態のメニューボタンウィジェットの文字色がピンク色になります。
menu_button = tkinter.Menubutton(
# 略
disabledforeground='pink'
)
takefocus
takefocus
は、メニューボタンウィジェットへのフォーカスの有効無効を指定するキーワード引数です。
フォーカスが有効なウィジェットは、例えばタブキーの押下によってフォーカスを当てることが可能となります。そして、フォーカスが当たっている場合、例えばボタンであれば、スペースキーの押下でボタンクリックを実施することが可能となります。また、フォーカスが有効なウィジェットがアプリ内に複数存在すれば、タブキーを押すたびに順番にそれらのウィジェットにフォーカスが当てられていくことになります。takefocus=True
を指定することで、メニューボタンウィジェットもフォーカスが有効になり、フォーカスを当てることが可能となります。
takefocus
には Bool 値 (True
/ False
) を指定します。takefocus
のデフォルト値は False
で、メニューボタンウィジェットのフォーカスは無効となっています。
例えば下記のようにメニューボタンウィジェットを生成すれば、そのメニューボタンウィジェットのフォーカスが有効となり、例えばタブキー押下によってフォーカスを当てることができるようになります。
menu_button = tkinter.Menubutton(
# 略
takefocus=True
)
highlightthickness
highlightthickness
は、フォーカス枠(そのメニューボタンウィジェットにフォーカスが当たっていることを示す枠)の太さを設定するキーワード引数です。フォーカス枠が存在する場合、メニューボタンウィジェットにフォーカスが当たっていればフォーカス枠の色が特定の色に変化し、フォーカスが外れればフォーカス枠の色が他の色に変化するようになっています。なので、このフォーカス枠より、そのメニューボタンウィジェットにフォーカスが当たっているかどうかを判断することができます。
ただし、先ほど説明したように、メニューボタンウィジェットはデフォルトでフォーカスが無効に設定されているため、フォーカスを当てられるようにするためには takefocus=True
の指定が必要となります。
highlightthickness
には 0
以上の整数を指定します。単位はピクセルとなります。デフォルトは、おそらく 0
となります。したがって、フォーカスが当たっていることを視覚的に判断できるようにしたいのであれば、highlightthickness
引数を指定して 1
以上の整数を設定する必要があります。
例えば下記のようにメニューボタンウィジェットを生成すれば、そのメニューボタンウィジェットのフォーカス枠の太さが 10
となります。
menu_button = tkinter.Menubutton(
# 略
highlightthickness=10
)
スポンサーリンク
highlightcolor
・highlightbackground
highlightcolor
は、先ほど説明したフォーカス枠における、フォーカスが当たっているときの枠の色を設定するキーワード引数です。それに対し、highlightbackground
は、フォーカスが外れているときの枠の色を指定するキーワード引数となります。
highlightcolor
と highlightbackground
の値としては、色名やカラーコード等を指定することが可能です。
例えば下記のようにメニューボタンウィジェットを生成すれば、そのメニューボタンウィジェットにフォーカスが当たっているときはフォーカス枠の色が赤色となり、フォーカスが外れているときはフォーカス枠の色が青色に変化するようになります。
menu_button = tkinter.Menubutton(
# 略
highlightthickness=10,
highlightcolor='red',
highlightbackground='blue'
)
wraplength
wraplength
は、メニューボタンウィジェット内の文字列(ボタン名)の折り返しの設定を行うキーワード引数です。
wraplength
には整数を指定します。単位はピクセルです。
wraplength
のデフォルト値は 0
となります。この場合、メニューボータンウィジェット内の文字列の折り返しは無効化されていることになり、どれだけ文字列が長くても折り返しが行われません。
それに対し、wraplength
に 1
以上の値を指定すると、上図のように文字列の横幅が wraplength
を超えた場合に文字列の折り返しが行われるようになります
例えば下記のようにメニューボタンウィジェットを生成すれば、そのメニューボタンウィジェット内の文字列の横幅が 100
ピクセルを超える場合に折り返しが行われるようになります。
menu_button = tkinter.Menubutton(
# 略
wraplength=100
)
justify
justify
は、メニューボタンウィジェット内の文字列(ボタン名)の「揃え」の方向の設定を行うキーワード引数です。複数行の文字列の右揃えや左揃えを設定することができます。justify
は、メニューボタンウィジェット内の文字列、すなわちボタン名が複数行にまたがる場合のみ有効な設定となります。つまり、ボタン名に改行が含まれる、もしくは wraplength
の指定によってボタン名が折り返しされている場合のみ有効な設定となります。
justify
には下記の3つの値を指定可能です。デフォルト値は tkinter.CENTER
となります。
tkinter.CENTER
:中央揃えtkinter.LEFT
:左揃えtkinter.RIGHT
:右揃え
例えば下記のようにメニューボタンウィジェットを生成すれば、そのメニューボタンウィジェット内の文字列が右揃えされる(ン
の文字が右に寄せられる)ことになります。
menu_button = tkinter.Menubutton(
# 略
text='メニューボタ\nン',
justify=tkinter.RIGHT
)
スポンサーリンク
image
image
は、メニューボタンウィジェットに表示する画像を設定するキーワード引数になります。ここまで説明してきたように、メニューボタンウィジェットには text
に指定した文字列や textvariable
にセットされた文字列が表示されることになりますが、image
を指定することで、文字列ではなく画像を表示することが可能となります(次に説明する compound
により画像と文字列の両方を表示することも可能です)。
image
の値には Tkinter の画像オブジェクトを指定する必要があります。この Tkinter の画像オブジェクトに関しては下記ページでまとめていますので、詳細は下記ページを参照してください。
例えば下記のようにメニューボタンウィジェットを作成すれば、そのメニューボタンウィジェット内には cat.png
の画像が表示されることになります。
photo = tkinter.PhotoImage(
file='cat.png',
)
menu_button = tkinter.Menubutton(
# 略
image=photo
)
compound
compound
は、メニューボタンウィジェットに画像と文字列を一緒に表示することを設定するキーワード引数になります。
compound
には下記の5つの値を指定することが可能です。下記における文字列とは、text
に指定した文字列 or textvariable
にセットされた文字列となります。
tkinter.TOP
:文字列の上側にimage
に指定した画像を表示するtkinter.BOTTOM
:文字列の下側にimage
に指定した画像を表示するtkinter.LEFT
:文字列の左側にimage
に指定した画像を表示するtkinter.RIGHT
:文字列の右側にimage
に指定した画像を表示するtkinter.NONE
:文字列 or 画像の一方のみを表示する(text
ortextvariable
とimage
の両方が指定されていればimage
を優先)
基本的には、文字列に対して image
に指定した画像をどちら側に表示するのかを上記の値で指定することになります。例えば、tkinter.BOTTOM
を指定すれば、文字列の下側(ボトム側)に image
に指定した画像が表示されることになります。
また、compound
のデフォルト値は tkinter.NONE
となります。そのため、compound
を指定しない場合は、メニューボタンウィジェットには文字列 or 画像のどちらか一方が表示されることになります。
例えば下記のようにメニューボタンウィジェットを作成すれば、そのメニューボタンウィジェット内には メニューボタン
という文字列+ cat.png
の画像が表示されることになります。compoud=tkinter.BOTTOM
を指定しているため、メニューボタン
という文字列の下側に cat.png
の画像が配置された形で表示されることになります。
photo = tkinter.PhotoImage(
file='cat.png',
)
menu_button = tkinter.Menubutton(
# 略
text='メニューボタン',
image=photo,
compound=tkinter.BOTTOM
)
cursor
cursor
は、マウスカーソルをメニューボタンウィジェット上に移動させたときのカーソルの見た目を設定するキーワード引数です。
cursor
に指定可能な値に関しては、公式の下記ページで紹介されていますので、下記ページを参考にしていただければと思います。
https://tcl.tk/man/tcl8.6/TkCmd/cursors.htm
例えば下記のようにメニューボタンウィジェットを生成すれば、メニューボタンウィジェット上にマウスカーソルを合わせたときのカーソルの見た目が「手」に変化します(Windows の場合は)。
menu_button = tkinter.Menubutton(
# 略
cursor='hand1'
)
スポンサーリンク
indicatoron
メニューボタンウィジェットでは、ウィジェットの右側に小さな長方形を表示することができるようになっています。おそらく、そのボタンがメニューボタンウィジェットであることを示すための長方形になると思います。この長方形の表示 / 非表示を設定するのが indicatoron
になります。
indicatoron
には Bool 値 (True
or False
) を指定します。indicatoron
のデフォルト値は False
となります。
例えば下記のようにメニューボタンウィジェットを生成すれば、メニューボタンウィジェットの右側に小さな長方形が表示されるようになります。
menu_button = tkinter.Menubutton(
# 略
indicatoron=True
)
Menubutton
クラスには Menubutton
クラス特有のメソッドは存在しないため、メソッドの紹介はスキップさせていただきます。
まとめ
このページでは、Tkinter のメニューボタンウィジェットについて解説しました!
メニューボタンウィジェットは「メニューを表示するボタン」です。メニューを表示するボタンはメニューバーにも設置できますが、メニューバーの場合は位置が固定となります。ですが、メニューボタンウィジェットを利用すれば、好きな位置にメニューを表示するボタンを設置することが可能となります。
ただ、なかなか使いどころの難しいウィジェットだとは思います…。まずは、こういったウィジェットが存在することを把握しておき、必要になったタイミングで、またこのページで使い方を調べてみていただければ良いと思います!
オススメ参考書(PR)
Tkinter に興味がある方には下記のPythonでつくる ゲーム開発 入門講座がオススメです。
Tkinter をゲーム開発を通して「楽しく学ぶ」ことができます。Python 入門者、Tkinter 入門者の方にオススメです。