【Tkinterの使い方】メニューボタンウィジェット(Menubutton)の使い方

メニューボタンウィジェットの解説ページアイキャッチ

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

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

メニューボタンウィジェットとは

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

メニューボタンウィジェット

メニューボタンウィジェットは、名前の通り、メニューを表示するボタンになります。

メニューボタンウィジェットの説明図

通常、メニューを表示するボタンはメニューバーに存在しますが、メニューボタンウィジェットを利用することで、メニューを表示するボタンをアプリ内の任意の位置に設置することが可能となります。

例えば Windows の場合はメニューバーがアプリの上部に存在し、このメニューバーのボタン(項目)をクリックすることでメニューを表示することができるようになっています。

メニューバーからメニューを表示する様子(Windows)

また、Mac の場合は PC のデスクトップの上部にメニューバーが存在し、このメニューバーのボタン(項目)をクリックすることでメニューを表示することができるようになっています。

メニューバーからメニューを表示する様子(Mac)

このように、メニューの表示はメニューバーのボタンをクリックすることで実施できるようになっています。ただし、メニューバーの位置は OS 等によって決まっているため、メニューを表示するボタンの位置は固定ということになります。

また、Tkinter においても、下記ページで解説している通り、メニューの表示をメニューウィジェットを利用して実現することが可能です。ただし、このメニューウィジェットで作成したメニューも基本的にはメニューバーに表示されることになります。なので、メニューウィジェットを利用した場合も、メニューを表示するボタンの位置は固定ということになります。

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におけるメニューの使い方の解説ページアイキャッチ Tkinterの使い方:メニュー(Menu)の使い方

メニューボタンウィジェットの見た目

また、メニューボタンウィジェットの見た目は Windows の場合と Mac の場合とで大きく異なります。

Windows の場合は下の図のようなボタンとなります。点線でボタンを囲っていますが、実際には点線も存在せず、デフォルト設定だと背景に溶け込んだような見た目となります(ボタン名のみが表示される)。

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 引数の指定も必要となります。

これらの引数については、メニューボタンウィジェットの設定 で詳細を説明していきます。

スポンサーリンク

メニューボタンウィジェットの配置

また、他のウィジェット同様に、作成したメニューボタンウィジェットをアプリ上に表示するためにはウィジェットの配置が必要となります。

このメニューボタンウィジェットの特徴は、メニューを表示するボタンを好きな位置に配置できるという点にあります。なので、下記ページで紹介している packgridplace メソッドを利用して、あなたの好きな位置にメニューボタンウィジェットを配置するようにしましょう。

ウィジェット配置方法解説ページのアイキャッチ Tkinterの使い方:ウィジェットの配置(pack・grid・place)

先ほど示したスクリプトにおいては、下記でメニューボタンウィジェットの配置を行っています。アプリのウィンドウの真ん中に表示されるように place メソッドを利用して配置しています。別に place ではなく、packgrid メソッドで配置しても良いです。重要なことは、意図した位置にウィジェットを配置できるようにメソッドを使い分けることです。

メニューボタンウィジェットの配置
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 のコンストラクタに指定可能な引数に関しては、前述でも紹介した下記ページで解説していますので、詳細に関しては下記ページを参照してください。

tkinterにおけるメニューの使い方の解説ページアイキャッチ Tkinterの使い方:メニュー(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におけるメニューの使い方の解説ページアイキャッチ Tkinterの使い方:メニュー(Menu)の使い方

また、ここでは、具体的には下記の設定について説明していきます。

ただし、Mac においては、基本的な設定となる menudirectiontext 等の設定は可能なのですが、特に色やサイズに関する設定を行うとメニューボタンウィジェットの見た目が変になることが多かったため、基本的には Mac 向けのアプリ開発時には色やサイズに関する設定は行わないことをオススメします。例えば、下図は実際に fontbackgroundheight を設定したときのメニューボタンウィジェットであり、ボタンの外側に背景色や文字がはみ出てしまい、意図したとおりの見た目に設定できませんでした。

Macで設定を変更すると背景色や文字がボタンからはみ出てしまうことを説明する図

とりあえず、Mac で動作確認をしていて見た目がおかしくなるような場合は、その設定は採用しないことをオススメします。

MEMO

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

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

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

ここまでの解説の中でも説明したように、menu は、メニューボタンウィジェットがクリックされた際に表示するメニューグループを設定するキーワード引数です。

menu引数の説明図

menu には、メニューウィジェット(Menu のインスタンス)を指定します。

この menu は、Menubutton のコンストラクタの引数にも指定可能ではあるのですが、基本的にはコンストラクタの引数には指定せず、メニューボタンウィジェットの使い方 で示したスクリプトのように、ウィジェット作成後に config メソッドを利用して menu の設定を行うことになります。その理由は、メニューボタンウィジェット作成前に、表示メニューに設定するメニューグループの作成ができないからです。

メニューグループを作成する時に実行するコンストラクタの引数にはメニューボタンウィジェットを指定する必要があります。なので、先にメニューボタンウィジェットを作成し、その後にメニューグループを作成する必要があります。つまり、メニューボタンウィジェット作成時には、その表示メニューとするメニューグループは存在しないことになります。なので、メニューボタンウィジェット作成時に表示メニューを設定することは不可です。

そのため、まずメニューボタンウィジェットを menu の設定なしに作成し、そのメニューボタンウィジェットを引数に指定してメニューグループを作成した後、config メソッドを利用して 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 は、クリック時に表示されるメニューの表示位置を設定するキーワード引数です。

flush引数の説明図

direction には、下記の5種類の値が指定可能です。デフォルトは 'below'になります。ちなみに、'flush' に関しては Windows の場合は指定しても効果なしでした…。

  • 'above':メニューをメニューボタンウィジェットの上側に表示
  • 'below':メニューをメニューボタンウィジェットの下側に表示
  • 'left':メニューをメニューボタンウィジェットの左側に表示
  • 'right':メニューをメニューボタンウィジェットの右側に表示
  • 'flush':メニューをメニューボタンウィジェットと重ねて表示

例えば下記のようにメニューボタンウィジェットを生成すれば、そのメニューボタンウィジェットをクリックした時にメニューがメニューボタンウィジェットの上側に表示されようになります。

directionの指定例
menu_button = tkinter.Menubutton(
    # 略
    direction='above'
)

スポンサーリンク

text

text は、メニューボタンウィジェットに表示するボタン名を設定するキーワード引数です。

text引数の説明図

text には、文字列を指定します。

例えば下記のようにメニューボタンウィジェットを生成すれば、そのメニューボタンウィジェットのボタン名が Menu と表示されることになります。

textの指定例
menu_button = tkinter.Menubutton(
    # 略
    text='Menu'
)

textvariable

textvariable は、メニューボタンウィジェットに表示するボタン名と連動するウィジェット変数を設定するキーワード引数です。

textvariable引数の説明図

textvariable には、ウィジェット変数を指定します。ボタン名と連動するウィジェット変数となりますので、StringVar で生成したウィジェット変数を指定することになると思います。

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

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

例えば下記のスクリプトのアプリでは、エントリーウィジェットに入力された文字列が、メニューボタンウィジェットのボタン名として表示されるようになります(メニューグループを作成していないので、メニューボタンウィジェットをクリックしてもメニューは表示されません)。

textvariableの指定例
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引数の説明図

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

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

例えば下記のようにメニューボタンウィジェットを生成すれば、そのメニューボタンウィジェットのボタン名のフォントサイズが 40 に変化することになります。

fontの指定例
menu_button = tkinter.Menubutton(
    # 略
    font=('', 40)
)

スポンサーリンク

underline

underline は、メニューボタンウィジェットのボタン名の特定の文字に下線を追加するキーワード引数です。

underline引数の説明図

underline には文字の位置を整数で指定します。これにより、underline に指定した位置の文字に下線が追加されます。underline に負の値や、文字数を超える値を指定した場合は下線が追加されないことになります。underline のデフォルト値は -1 です。

例えば下記のようにメニューボタンウィジェットを生成すれば、そのメニューボタンウィジェットのボタン名の先頭の文字(B)に下線が追加されることになります。

underlineの指定例
menu_button = tkinter.Menubutton(
    # 略
    text='Button',
    underline=0
)

width

width は、メニューボタンウィジェットの幅を指定するキーワード引数です。

width引数の説明図

width には、文字数を整数で指定します。これにより、その文字数分の文字幅にメニューボタンウィジェットの幅が設定されます。ただし、基本的に半角文字をベースにウィジェットの幅が設定されるようになっているため、ボタン名に全角文字が含まれる場合は、文字数よりも大きめの値を指定することをオススメします。

例えば下記のようにメニューボタンウィジェットを生成すれば、そのメニューボタンウィジェットが 10 文字分の幅に設定されます。

widthの指定例
text= tkinter.Menubutton(
    # 略
    width=10
)

height

height は、メニューボタンウィジェットの高さを指定するキーワード引数です。

height引数の説明図

height には、width と同様に文字数を整数で指定します。これにより、その文字数分の文字が縦方向に収まるようにメニューボタンウィジェットの高さが設定されます。

例えば下記のようにメニューボタンウィジェットを生成すれば、そのメニューボタンウィジェットが 10 文字分の高さに設定されます。

heightの指定例
menu_button = tkinter.Menubutton(
    # 略
    height=10
)

スポンサーリンク

background

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

background引数の説明図

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

例えば下記のようにメニューボタンウィジェットを生成すれば、そのメニューボタンウィジェットの背景色が赤色に変化することになります。

backgroundの指定例
menu_button = tkinter.Menubutton(
    # 略
    background='red'
)

foreground

foreground は、メニューボタンウィジェットのボタン名の文字色を設定するキーワード引数です。foreground に関しては、略して fg キーワード引数で指定することも可能です。 

foreground引数の説明図

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

例えば下記のようにメニューボタンウィジェットを生成すれば、そのメニューボタンウィジェットのボタン名の文字色が青色に変化することになります。

foregroundの指定例
menu_button = tkinter.Menubutton(
    # 略
    foreground='blue'
)

borderwidth

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

borderwidth引数の説明図

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

少なくとも Windows の場合は、次に説明する relief のデフォルトが tkinter.FLAT になっており、この場合は外枠の太さを変化させてもそれが見た目では分からないようになっているので注意してください。borderwidth への指定値によって外枠が変化する様子を確認したいのであれば、relief に tkinter.FLAT 以外を指定してください。

例えば下記のようにメニューボタンウィジェットを生成すれば、メニューボタンウィジェットの外枠の幅が 10 ピクセルに変化します。

borderwidthの指定例
menu_button = tkinter.Menubutton(
    # 略
    borderwidth=10
)

スポンサーリンク

relief

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

relief引数の説明図

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

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

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

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

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

state

state は、メニューボタンウィジェットの状態を設定するキーワード引数です。

state引数の説明図

state には下記の3つの値が指定可能です。デフォルトは tkinter.NORMAL となります。また、tkinter.DISABLED を指定して無効化すると、そのメニューボタンウィジェットのクリックが不可となります。

  • tkinter.NORMAL:有効化
  • tkinter.ACTIVE:有効化?
  • tkinter.DISABLED:無効化

例えば下記のようにメニューボタンウィジェットを生成すれば、そのメニューボタンウィジェットのクリックが不可となります。

stateの指定例
menu_button = tkinter.Menubutton(
    # 略
    state=tkinter.DISABLED
)

anchor

anchor は、メニューボタンウィジェットのボタン名の表示位置を設定するキーワード引数です。

anchor引数の説明図

特に、この設定の変更の効果が分かりやすいのは、メニューボタンウィジェットに対してボタン名が小さい場合、より具体的に言えば、widthheight に大きな値が設定されている場合となります。

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 (西) をそれぞれ表していますので、東西南北の関係で考えると、各指定値でどの方向にボタン名が表示されるのかをイメージしやすくなると思います。

anchorへの指定値と東西南北の関係性を示す図

例えば下記のようにメニューボタンウィジェットを生成すれば、そのメニューボタンウィジェットのボタン名が右下に表示されるようになります。

anchorの指定例
menu_button = tkinter.Menubutton(
    # 略
    anchor=tkinter.SE
)

スポンサーリンク

padxpady

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

padx引数とpady引数の説明図

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

この padxpady は、基本的には先ほど説明した anchor とセットで指定する必要があります。anchor のみの指定の場合、例えば左上や右下といった、特定の方向の隅にボタン名が表示されることになります。padxpady を指定すれば、隅ではなく余白を空けた位置にボタン名を表示することができるようになります。

例えば anchortkinter.NW を指定している場合は、上の図のようにメニューボタンウィジェットの左上隅から横方向に padx ピクセル、縦方向に pady ピクセルの余白を空けた位置にボタン名が表示されることになります。

あくまでも、padxpady は、ボタン名を特定の方向の隅から余白を空けてボタン名を表示するための引数であり、ボタン名を中心に表示する anchor=tkinter.CENTER を指定している場合や anchor を指定していない場合は効果が出ないので注意してください。

例えば下記のようにメニューボタンウィジェットを生成すれば、メニューボタンウィジェットの右下隅から横方向に 10 ピクセル、縦方向に 20 ピクセルの余白を空けた位置にボタン名が表示されることになります。

padxとpadyの指定例
menu_button = tkinter.Menubutton(
    # 略
    padx=10,
    pady=20,
    anchor=tkinter.SE
)

activebackground

activebackground は、メニューボタンウィジェット上にマウスカーソルが存在する場合のメニューボタンウィジェットの背景色を設定するキーワード引数です。

activebackground引数の説明図

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

例えば下記のようにメニューボタンウィジェットを生成すれば、メニューボタンウィジェット上にマウスカーソルが存在する場合のメニューボタンウィジェットの背景色が緑色になります。

activebackgroundの指定例
menu_button = tkinter.Menubutton(
    # 略
    activebackground='green'
)

activeforeground

activeforeground は、メニューボタンウィジェット上にマウスカーソルが存在する場合のメニューボタンウィジェットの文字色を設定するキーワード引数です。

activeforeground引数の説明図

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

例えば下記のようにメニューボタンウィジェットを生成すれば、メニューボタンウィジェット上にマウスカーソルが存在する場合のメニューボタンウィジェットの文字色がオレンジ色になります。

activeforegroundの指定例
menu_button = tkinter.Menubutton(
    # 略
    activeforeground='orange'
)

スポンサーリンク

disabledforeground

disabledforeground は、無効状態のメニューボタンウィジェットの文字色を設定するキーワード引数です。state で説明したように、state=tkinter.DISABLED を指定することで、メニューボタンウィジェットを無効化することができます。そして、その時の文字色を指定するのが、この disabledforeground となります。

disabledforeground引数の説明図

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

例えば下記のようにメニューボタンウィジェットを生成すれば、無効状態のメニューボタンウィジェットの文字色がピンク色になります。

disabledforegroundの指定例
menu_button = tkinter.Menubutton(
    # 略
    disabledforeground='pink'
)

takefocus

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

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

takefocus引数の説明図

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

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

takefocusの指定例
menu_button = tkinter.Menubutton(
    # 略
    takefocus=True
)

highlightthickness

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

highlightthickness引数の説明図

ただし、先ほど説明したように、メニューボタンウィジェットはデフォルトでフォーカスが無効に設定されているため、フォーカスを当てられるようにするためには takefocus=True の指定が必要となります。 

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

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

highlightthicknessの指定例
menu_button = tkinter.Menubutton(
    # 略
    highlightthickness=10
)

スポンサーリンク

highlightcolorhighlightbackground

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

highlightcolor引数とhighlightbackground引数の説明図

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

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

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

wraplength

wraplength は、メニューボタンウィジェット内の文字列(ボタン名)の折り返しの設定を行うキーワード引数です。

wraplength引数の説明図

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

wraplength のデフォルト値は 0 となります。この場合、メニューボータンウィジェット内の文字列の折り返しは無効化されていることになり、どれだけ文字列が長くても折り返しが行われません。

それに対し、wraplength1 以上の値を指定すると、上図のように文字列の横幅が wraplength を超えた場合に文字列の折り返しが行われるようになります

例えば下記のようにメニューボタンウィジェットを生成すれば、そのメニューボタンウィジェット内の文字列の横幅が 100 ピクセルを超える場合に折り返しが行われるようになります。

wraplengthの指定例
menu_button = tkinter.Menubutton(
    # 略
    wraplength=100
)

justify

justify は、メニューボタンウィジェット内の文字列(ボタン名)の「揃え」の方向の設定を行うキーワード引数です。複数行の文字列の右揃えや左揃えを設定することができます。justify は、メニューボタンウィジェット内の文字列、すなわちボタン名が複数行にまたがる場合のみ有効な設定となります。つまり、ボタン名に改行が含まれる、もしくは wraplength の指定によってボタン名が折り返しされている場合のみ有効な設定となります。

justify引数の説明図

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

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

例えば下記のようにメニューボタンウィジェットを生成すれば、そのメニューボタンウィジェット内の文字列が右揃えされる( の文字が右に寄せられる)ことになります。

justifyの指定例
menu_button = tkinter.Menubutton(
    # 略
    text='メニューボタ\nン',
    justify=tkinter.RIGHT
)

スポンサーリンク

image

image は、メニューボタンウィジェットに表示する画像を設定するキーワード引数になります。ここまで説明してきたように、メニューボタンウィジェットには text に指定した文字列や textvariable にセットされた文字列が表示されることになりますが、image を指定することで、文字列ではなく画像を表示することが可能となります(次に説明する compound により画像と文字列の両方を表示することも可能です)。

image引数の説明図

image の値には Tkinter の画像オブジェクトを指定する必要があります。この Tkinter の画像オブジェクトに関しては下記ページでまとめていますので、詳細は下記ページを参照してください。

Tkinterで画像を扱う方法の解説ページアイキャッチ Tkinter の使い方:PhotoImage・BitmapImageクラスで画像を扱う

例えば下記のようにメニューボタンウィジェットを作成すれば、そのメニューボタンウィジェット内には cat.png の画像が表示されることになります。

imageの指定例
photo = tkinter.PhotoImage(
    file='cat.png',
)

menu_button = tkinter.Menubutton(
    # 略
    image=photo
)

compound

compound は、メニューボタンウィジェットに画像と文字列を一緒に表示することを設定するキーワード引数になります。

compound引数の説明図

compound には下記の5つの値を指定することが可能です。下記における文字列とは、text に指定した文字列 or textvariable にセットされた文字列となります。

  • tkinter.TOP:文字列の上側に image に指定した画像を表示する
  • tkinter.BOTTOM:文字列の下側image に指定した画像を表示する
  • tkinter.LEFT:文字列の左側に image に指定した画像を表示する
  • tkinter.RIGHT:文字列の右側に image に指定した画像を表示する
  • tkinter.NONE:文字列 or 画像の一方のみを表示する(text or  textvariableimage の両方が指定されていれば image を優先)

基本的には、文字列に対して image に指定した画像をどちら側に表示するのかを上記の値で指定することになります。例えば、tkinter.BOTTOM を指定すれば、文字列の下側(ボトム側)に image に指定した画像が表示されることになります。

また、compound のデフォルト値は tkinter.NONE となります。そのため、compound を指定しない場合は、メニューボタンウィジェットには文字列 or 画像のどちらか一方が表示されることになります。

例えば下記のようにメニューボタンウィジェットを作成すれば、そのメニューボタンウィジェット内には メニューボタン という文字列+ cat.png の画像が表示されることになります。compoud=tkinter.BOTTOM を指定しているため、メニューボタン という文字列の下側に cat.png の画像が配置された形で表示されることになります。

compoundの指定例
photo = tkinter.PhotoImage(
    file='cat.png',
)

menu_button = tkinter.Menubutton(
    # 略
    text='メニューボタン',
    image=photo,
    compound=tkinter.BOTTOM
)

cursor

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

cursor引数の説明図

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

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

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

cursorの指定例
menu_button = tkinter.Menubutton(
    # 略
    cursor='hand1'
)

スポンサーリンク

indicatoron

メニューボタンウィジェットでは、ウィジェットの右側に小さな長方形を表示することができるようになっています。おそらく、そのボタンがメニューボタンウィジェットであることを示すための長方形になると思います。この長方形の表示 / 非表示を設定するのが indicatoron になります。

indicatoron引数の説明図

indicatoron には Bool 値 (True or False) を指定します。indicatoron のデフォルト値は False となります。

例えば下記のようにメニューボタンウィジェットを生成すれば、メニューボタンウィジェットの右側に小さな長方形が表示されるようになります。

indicatoronの指定例
menu_button = tkinter.Menubutton(
    # 略
    indicatoron=True
)

Menubutton クラスのメソッド

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

まとめ

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

メニューボタンウィジェットは「メニューを表示するボタン」です。メニューを表示するボタンはメニューバーにも設置できますが、メニューバーの場合は位置が固定となります。ですが、メニューボタンウィジェットを利用すれば、好きな位置にメニューを表示するボタンを設置することが可能となります。

ただ、なかなか使いどころの難しいウィジェットだとは思います…。まずは、こういったウィジェットが存在することを把握しておき、必要になったタイミングで、またこのページで使い方を調べてみていただければ良いと思います!

オススメ参考書(PR)

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

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

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