【Python GUI実用サンプル】Tkinter TopLevelとWidget.after()メソッドを使用してToolTip(ツールチップ)を作成する

<tkinterトップページに戻る>

ツールチップ

ツールチップ(英語:tooltip)とは、グラフィカルユーザインタフェース(GUI)において普及した表現手法・共通要素のひとつ(ウィジェット)である。

これはカーソル(主にマウスポインタ)と連動して使用される。ユーザーがカーソルを何かの項目に合わせたとき、

その項目に覆いかぶさるような形で小さな枠が出現し、その枠内には選択された項目に関する補足情報が表示される。

wikipediaより

サンプルキャプチャ

tooltip

 

プログラムサンプルコード

from tkinter import *
import tkinter.ttk as ttk


class ToolTip:
    def __init__(self, widget,messeage):
        self.widget = widget
        self.tipdialog  = None
        self.id =None
        self.messeage=messeage
        self.addEvent()

    def addEvent(self):
        self.widget.bind("<Enter>", self.focusAction)
        self.widget.bind("<Leave>", self.leaveAction)

    def leaveAction(self, event=None):
        self.cancel()
        self.hidetip()

    def focusAction(self,event):
        # 今までのをクリアして表示する
        self.cancel()
        self.id = self.widget.after(500, self.showTip)

    def cancel(self):
        id = self.id
        self.id = None
        # 予約されたアクションを取り消す
        if id:
            self.widget.after_cancel(id)

    #説明テキストの表示
    def showTip(self):
        # 既に表示されてる場合は処理の必要なし
        if self.tipdialog:
            return
        # Widget幅の1/3程度右方向に離す
        x = self.widget.winfo_rootx() + self.widget.winfo_width()/3
        # +3与えることでWidgetと少し離す
        y = self.widget.winfo_rooty() + self.widget.winfo_height()+3
        self.tipdialog = Toplevel(self.widget)
        # □xボタンのバーは必要ない
        self.tipdialog.wm_overrideredirect(True)
        # ダイアログの位置を指定
        self.tipdialog.wm_geometry("+%d+%d" % (x, y))
        # 背景白で左寄せ
        label = Label(self.tipdialog, text=self.messeage, justify=LEFT,
                      background="#ffffff")
        label.pack()

    def hidetip(self):
        tw = self.tipdialog
        self.tipdialog = None
        if tw:
            tw.destroy()
class ToolTipSample(ttk.Frame):
    def __init__(self ,master):
        super().__init__(master)
        label = Label(self, text="ボタンにマウスをかざしてください")

        label.pack()
        button = ttk.Button(self,text="toolTip")
        button.pack()
        ToolTip(button,"このチップはボタンテスト")
        ToolTip(label,"このチップはラベルテスト")
        self.pack()


if __name__ == '__main__':
    master = Tk()
    master.title("ToolTipSample")
    master.geometry("300x100")
    ToolTipSample(master)
    master.mainloop()

 

メモ

widget.after

全てのWidgetに共通するメソッド

self.id = self.widget.after(500, self.showTip)

のように指定することで指定ミリ秒(500)後指定された関数(self.showTip)を実行する。

戻り値としてwidget.after_cancel(実行予約キャンセル)用の識別IDが取得できる

wm_overrideredirect(bool)

拡大縮小(_、□)、閉じる(×)のバーを隠すメソッド

Trueを指定することでバーを隠すことができる

※より詳細な実装を行いたい場合はidleの中にあるtooltip.pyを参考にしてください。

 

 

 

あわせて読みたい