tkinter 气泡提示做的功能改进.还不满意望你来再添码
改进版 小气泡提示工具,用于提示内容过多,带滚动条,不满意的地方,内容多(过长)时就不好展示,怎么随着内容增加减少剧中展示?
from tkinter import *
import tkinter.ttk as ttk
import tkinter.tix as Tix
class ToolTip:
'''针对指定的 widget 创建一个 tooltip'''
def __init__(self, widget, text, timeout=500, offset=(0, -10), **kw):
'''
参数
=======
widget: tkinter 小部件
text: (str) tooltip 的文本信息
timeout: 鼠标必须悬停 timeout 毫秒,才会显示 tooltip
'''
# 设置 用户参数
self.widget = widget
#self.fwidget = fwidget
self.text = text
self.timeout = timeout
self.offset = offset
self.tip_enter_in = False
# 内部参数初始化
self._init_params()
# 绑定事件
self.widget.bind("<Enter>", self.enter)
self.widget.bind("<Leave>", self.widgetleave)
self.widget.bind("<ButtonPress>",self.widgetleave)
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):
topwindow = Tix.Toplevel(self.widget, )
# 设置窗体属性隐藏窗体的标题、状态栏等
topwindow.overrideredirect(True)
# 保持在主窗口的上面
topwindow.attributes("-toolwindow", 1)# 也可以使用 `-topmost`
topwindow.attributes("-alpha", 0.92857142857) # 设置透明度为 13/14
topwindow.resizable(width=True,height=True)
x = self.widget.winfo_rootx() + self.x + self.offset
y = self.widget.winfo_rooty() + self.y + self.offset
topwindow.wm_geometry("+%d+%d" % (x, y))
self.ybarwidget = Tix.Scrollbar(topwindow, orient=Tix.VERTICAL)
self.ybarwidget.pack(side=Tix.RIGHT, fill=Tix.Y)
self.ybarwidget.forget() #隐藏滚动条 ,
self.canvasw=Tix.Canvas(topwindow,yscrollcommand=self.ybarwidget.set,)
self.canvasw.pack(side=Tix.TOP, fill=Tix.BOTH, expand=1) #放置canvas的位置
self.ybarwidget.configure(command=self.canvasw.yview) #滚动条命令关联画布yview
self.framew=Tix.Frame(self.canvasw) #把frame放在canvas里,要滚动的子部件放在framew 里
self.framew.pack()
self.canvasw.bind_all("<MouseWheel>",lambda event:self.canvasw.yview_scroll(int(-1 * (event.delta / 120)), "units"))
topwindow.bind("<Enter>", self.tip_enter)
self.canvasw.bind("<Leave>", self.windowleave)
return topwindow
def showtip(self):
"""
创建一个带有工具提示文本的 topoltip 窗口
"""
params = {
'text': self.text,
'justify': 'left',
'background': self.background,
'relief': 'solid',
'borderwidth': 0}
self.hidetip() #展示前先清空
self.tipwindow = self.tip_window()
label = ttk.Label(self.framew,**params)
label.pack()
self.canvasxy =self.canvasw.create_window((105,000),anchor="n",window=self.framew)
self.canvasw["scrollregion"]=(0,00,000,700)
root.update()
self.canvasw.config(width=label.winfo_width(),height=label.winfo_height())
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 windowleave(self, event):
"""
鼠标离开 widget 的销毁 tooltip window
参数
=========
:event:来自于 tkinter,没有被使用
"""
if self.tipwindow :
self.hidetip()
self.tip_enter_in = False
def widgetleave(self,event):
#self.tip_enter_in = None
self.widget.after(self.timeout*3, self.get_tip_enter)
self.widget.update()
if self.tip_enter_in:
print("已进入self.tip_enter_in:",self.tip_enter_in)
pass
elif self.tip_enter_in ==False:
print("--------正在离开widget",self.tip_enter_in)
self.hidetip()
self.tip_enter_in = False
def tip_enter(self,event):
"鼠标进入提示框"
self.tip_enter_in = True
#self.showtip()
def get_tip_enter(self):
return self.tip_enter_in
root = Tk()
lb = ttk.Label(root, text='测试 ToolTip', font=('',27))
tooltip = ToolTip(lb,text='''您好!您好!\n\
您好!您好!您好!\n\
您好!您好!您好!您好!您好!\n\
您好!您好!您好!您好!您好!\n\
您好!您好!您好!您好!您好!\n\
您好!您好!您好!您好!您好!\n\
您好!您好!您好!您好!您好!\n\
您好!您好!您好!您好!您好!
您好!您好!您好!\n\
您好!您好!您好!您好!您好!\n\
您好!您好!您好!您好!您好!\n\
您好!您好!您好!您好!您好您好!\n\
您好!您好!您好!您好!\n\
您好!您好!您好!您好!您好!您好!您好!您好!您好!您好!\n\
您好!您好!您好!您好!您好!\n\
您好!您好!您好!您好!您好!\n\
您好!您好!您好!您好!您好!\n\
您好!您好!您好!您好!您好!\n\
您好!您好!您好!您好!您好!\n\
您好!您好!您好!您好!您好!\n\
您好!您好!您好!您好!您好!\n''')
lb.pack()
root.mainloop()
放张图片
页:
[1]