|
5鱼币
本帖最后由 阳顺 于 2020-11-11 18:20 编辑
改进版 小气泡提示工具, 用于提示内容过多,带滚动条,
不满意的地方,内容多(过长)时就不好展示,
怎么改进成随着提示内容增加减少气泡提示区内容居中展示?
如果有朋友会的,最好能用tix原版小气泡提示方法完善出来,
因为 我看不懂tix的源码,不知道怎么完善,不行,在我的代码里完善也行.
自己写的加强版提示工具带滚动条,这个也不完善,希望大家来看看.
- 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[0]
- y = self.widget.winfo_rooty() + self.y + self.offset[1]
- 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()
复制代码
|
|