阳顺 发表于 2020-11-9 17:50:08

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()


阳顺 发表于 2020-11-9 17:53:43

放张图片
页: [1]
查看完整版本: tkinter 气泡提示做的功能改进.还不满意望你来再添码