5 tkinter 之 ToolTip 与 tix.Balloo
2020-01-14 本文已影响0人
水之心
1 自定义 ToolTip
提示框工具(当用户将光标移动到已绑定了窗口小部件中时,屏幕上将显示一个带有描述性消息的小型弹出式窗口)是很实用的,应用场景很广泛。本文参考:stackoverflow 编写如下代码:
class ToolTip:
'''针对指定的 widget 创建一个 tooltip
参考:https://stackoverflow.com/a/36221216
'''
def __init__(self, widget, text, timeout=500, offset=(0, -20), **kw):
'''
参数
=======
widget: tkinter 小部件
text: (str) tooltip 的文本信息
timeout: 鼠标必须悬停 timeout 毫秒,才会显示 tooltip
'''
# 设置 用户参数
self.widget = widget
self.text = text
self.timeout = timeout
self.offset = offset
# 内部参数初始化
self._init_params()
# 绑定事件
self.widget.bind("<Enter>", self.enter)
self.widget.bind("<Leave>", self.leave)
self.widget.bind("<ButtonPress>", self.leave)
def _init_params(self):
'''内部参数的初始化'''
self.id_after = None
self.x, self.y = 0, 0
self.tipwindow = None
self.background = 'lightyellow'
def cursor(self, event):
'''设定 鼠标光标的位置坐标 (x,y)'''
self.x = event.x
self.y = event.y
def unschedule(self):
'''取消用于鼠标悬停时间的计时器'''
if self.id_after:
self.widget.after_cancel(self.id_after)
else:
self.id_after = None
def tip_window(self):
window = Toplevel(self.widget)
# 设置窗体属性
## 隐藏窗体的标题、状态栏等
window.overrideredirect(True)
## 保持在主窗口的上面
window.attributes("-toolwindow", 1) # 也可以使用 `-topmost`
window.attributes("-alpha", 0.92857142857) # 设置透明度为 13/14
x = self.widget.winfo_rootx() + self.x + self.offset[0]
y = self.widget.winfo_rooty() + self.y + self.offset[1]
window.wm_geometry("+%d+%d" % (x, y))
return window
def showtip(self):
"""
创建一个带有工具提示文本的 topoltip 窗口
"""
params = {
'text': self.text,
'justify': 'left',
'background': self.background,
'relief': 'solid',
'borderwidth': 1
}
self.tipwindow = self.tip_window()
label = ttk.Label(self.tipwindow, **params)
label.grid(sticky='nsew')
def schedule(self):
"""
安排计时器以计时鼠标悬停的时间
"""
self.id_after = self.widget.after(self.timeout, self.showtip)
def enter(self, event):
"""
鼠标进入 widget 的回调函数
参数
=========
:event: 来自于 tkinter,有鼠标的 x,y 坐标属性
"""
self.cursor(event)
self.schedule()
def hidetip(self):
"""
销毁 tooltip window
"""
if self.tipwindow:
self.tipwindow.destroy()
else:
self.tipwindow = None
def leave(self, event):
"""
鼠标离开 widget 的销毁 tooltip window
参数
=========
:event: 来自于 tkinter,没有被使用
"""
self.unschedule()
self.hidetip()
下面看一个示例:
root = Tk()
lb = ttk.Label(root, text='测试 ToolTip', font=('',27))
tooltip = ToolTip(lb, "您好!")
lb.grid()
root.mainloop()
显示效果图:

更加通用的 ToolTip 见我的 GitHub: tkinter_action。
2 使用 tix.Balloon 实现 ToolTip
参考:用Tkinter打造GUI开发工具(17)tix.Balloon气球窗口小部件
Tix.Balloon
气球窗口小部件一个部件弹出提供帮助。当用户将光标移动到已绑定了气球窗口小部件的窗口小部件中时,屏幕上将显示一个带有描述性消息的小型弹出式窗口。
使用 tix.Balloon
气球窗口小部件的构造语法如下:
balloon = tix.Balloon (master, statusbar=None)
参数 master
这代表了父部件。statusbar
是这个部件的绑定的状态条部件。
tix.Balloon
除了上面的属性外,还有一些方法可以使用。
直接看代码:
TCL_ALL_EVENTS = 0
class CustomBalloon:
def __init__(self, window):
self.window = window
self.exit = -1
self.create_widget(window)
def create_widget(self, window):
z = window.winfo_toplevel() # 获取 TopLevel 窗口
z.wm_protocol("WM_DELETE_WINDOW", lambda self=self: self.quitcmd())
z.title('Tix.Balloon演示') #Tkinter中设置窗口标题方法
status = ttk.Label(window, width=40, relief='sunken')
status.grid()
# 建立2个 tix按钮
button1 = ttk.Button(window, text='关闭窗口',
command=self.quitcmd)
button2 = ttk.Button(window, text='按钮自毁')
button2['command'] = lambda w=button2: w.destroy()
button1.grid()
button2.grid()
# 建立 tixballoon
b = tix.Balloon(window, statusbar=status)
b.bind_widget(button1, balloonmsg='关闭这个窗口',
statusmsg='按下这个按钮,关闭窗口。')
b.bind_widget(button2, balloonmsg='删除这个按钮',
statusmsg='按下这个按钮,删除这个按钮。')
def quitcmd (self):
self.exit = 0
def mainloop(self):
foundEvent = 1
while self.exit < 0 and foundEvent > 0:
foundEvent = self.window.tk.dooneevent(TCL_ALL_EVENTS)
def destroy (self):
self.window.destroy()
# 必须使用 tix.Tk(),不能使用 tkinter.Tk()
root = tix.Tk()
balloon = CustomBalloon(root)
balloon.mainloop()
balloon.destroy()
效果图:
