【Python GUI実用サンプル】Tkinter TopLevelとWidget.after()メソッドを使用してToolTip(ツールチップ)を作成する
ツールチップ
ツールチップ(英語:tooltip)とは、グラフィカルユーザインタフェース(GUI)において普及した表現手法・共通要素のひとつ(ウィジェット)である。
これはカーソル(主にマウスポインタ)と連動して使用される。ユーザーがカーソルを何かの項目に合わせたとき、
その項目に覆いかぶさるような形で小さな枠が出現し、その枠内には選択された項目に関する補足情報が表示される。
wikipediaより
サンプルキャプチャ

プログラムサンプルコード
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を参考にしてください。