鱼C论坛

 找回密码
 立即注册
查看: 2757|回复: 1

tkinter 气泡提示工具窗口的改进,有点小问题希望朋友们看看来发挥下哈

[复制链接]
发表于 2020-11-11 18:13:58 | 显示全部楼层 |阅读模式
5鱼币
本帖最后由 阳顺 于 2020-11-11 18:20 编辑

改进版 小气泡提示工具,  用于提示内容过多,带滚动条,
不满意的地方,内容多(过长)时就不好展示,
怎么改进成随着提示内容增加减少气泡提示区内容居中展示?

如果有朋友会的,最好能用tix原版小气泡提示方法完善出来,
因为  我看不懂tix的源码,不知道怎么完善,不行,在我的代码里完善也行.
自己写的加强版提示工具带滚动条,这个也不完善,希望大家来看看.

  1. from tkinter import *
  2. import tkinter.ttk as ttk
  3. import tkinter.tix as Tix

  4. class ToolTip:
  5.     '''针对指定的 widget 创建一个 tooltip'''
  6.    
  7.     def __init__(self, widget, text, timeout=500, offset=(0, -10), **kw):
  8.         '''
  9.         参数
  10.         =======
  11.         widget: tkinter 小部件
  12.         text: (str) tooltip 的文本信息
  13.         timeout: 鼠标必须悬停 timeout 毫秒,才会显示 tooltip
  14.         '''
  15.         # 设置 用户参数
  16.         self.widget = widget
  17.         #self.fwidget = fwidget
  18.         self.text = text
  19.         self.timeout = timeout
  20.         self.offset = offset
  21.         self.tip_enter_in = False
  22.         # 内部参数初始化
  23.         self._init_params()
  24.         # 绑定事件
  25.         self.widget.bind("<Enter>", self.enter)
  26.         self.widget.bind("<Leave>", self.widgetleave)
  27.         self.widget.bind("<ButtonPress>",self.widgetleave)
  28.         
  29.     def _init_params(self):
  30.         '''内部参数的初始化'''
  31.         self.id_after = None
  32.         self.x, self.y = 0, 0
  33.         self.tipwindow = None
  34.         self.background = 'lightyellow'
  35.         
  36.     def cursor(self, event):
  37.         '''设定 鼠标光标的位置坐标 (x,y)'''
  38.         self.x = event.x
  39.         self.y = event.y
  40.         
  41.     def unschedule(self):
  42.         '''取消用于鼠标悬停时间的计时器'''
  43.         if self.id_after:
  44.             self.widget.after_cancel(self.id_after)
  45.         else:
  46.             self.id_after = None

  47.     def tip_window(self):
  48.         topwindow = Tix.Toplevel(self.widget, )
  49.         
  50.         # 设置窗体属性隐藏窗体的标题、状态栏等
  51.         topwindow.overrideredirect(True)
  52.         # 保持在主窗口的上面
  53.         topwindow.attributes("-toolwindow", 1)  # 也可以使用 `-topmost`
  54.         topwindow.attributes("-alpha", 0.92857142857)    # 设置透明度为 13/14
  55.         topwindow.resizable(width=True,height=True)
  56.         x = self.widget.winfo_rootx() + self.x + self.offset[0]
  57.         y = self.widget.winfo_rooty() + self.y + self.offset[1]
  58.         topwindow.wm_geometry("+%d+%d" % (x, y))

  59.         self.ybarwidget = Tix.Scrollbar(topwindow, orient=Tix.VERTICAL)
  60.         self.ybarwidget.pack(side=Tix.RIGHT, fill=Tix.Y)
  61.         self.ybarwidget.forget()                                           #隐藏滚动条 ,
  62.             
  63.         self.canvasw=Tix.Canvas(topwindow,yscrollcommand=self.ybarwidget.set,)   
  64.         self.canvasw.pack(side=Tix.TOP, fill=Tix.BOTH, expand=1)      #放置canvas的位置
  65.    
  66.         self.ybarwidget.configure(command=self.canvasw.yview)         #滚动条命令关联画布yview
  67.      
  68.         self.framew=Tix.Frame(self.canvasw)       #把frame放在canvas里,要滚动的子部件放在framew 里
  69.         self.framew.pack()            
  70.                      
  71.         self.canvasw.bind_all("<MouseWheel>",lambda event:self.canvasw.yview_scroll(int(-1 * (event.delta / 120)), "units"))
  72.                
  73.         topwindow.bind("<Enter>", self.tip_enter)      
  74.         self.canvasw.bind("<Leave>", self.windowleave)
  75.         
  76.         return topwindow
  77.             
  78.     def showtip(self):
  79.         """
  80.         创建一个带有工具提示文本的 topoltip 窗口
  81.         """
  82.         params = {
  83.             'text': self.text,
  84.             'justify': 'left',
  85.             'background': self.background,
  86.             'relief': 'solid',
  87.             'borderwidth': 0  }
  88.         self.hidetip()                     #展示前先清空
  89.         self.tipwindow = self.tip_window()
  90.         
  91.         
  92.         label = ttk.Label(self.framew,**params)
  93.         label.pack()
  94.         
  95.         self.canvasxy =self.canvasw.create_window((105,000),anchor="n",window=self.framew)           
  96.         self.canvasw["scrollregion"]=(0,00,000,700)                                            
  97.                                                                         
  98.         root.update()
  99.         self.canvasw.config(width=label.winfo_width(),height=label.winfo_height())
  100.         
  101.     def schedule(self):
  102.         """
  103.         安排计时器以计时鼠标悬停的时间
  104.         """
  105.         self.id_after = self.widget.after(self.timeout, self.showtip)
  106.         
  107.     def enter(self, event):
  108.         """
  109.         鼠标进入 widget 的回调函数
  110.         
  111.         参数
  112.         =========
  113.         :event:  来自于 tkinter,有鼠标的 x,y 坐标属性
  114.         """
  115.         self.cursor(event)
  116.         self.schedule()
  117.         
  118.     def hidetip(self):
  119.         """
  120.         销毁 tooltip window
  121.         """
  122.         if self.tipwindow :            
  123.             self.tipwindow.destroy()
  124.         else:
  125.             self.tipwindow = None
  126.          
  127.     def windowleave(self, event):
  128.         """
  129.         鼠标离开 widget 的销毁 tooltip window
  130.          
  131.         参数
  132.         =========
  133.         :event:  来自于 tkinter,没有被使用
  134.         """
  135.         if self.tipwindow :
  136.                
  137.             self.hidetip()
  138.             self.tip_enter_in = False


  139.     def widgetleave(self,event):
  140.         #self.tip_enter_in = None
  141.         self.widget.after(self.timeout*3, self.get_tip_enter)        
  142.         self.widget.update()
  143.         if self.tip_enter_in:
  144.             print("已进入self.tip_enter_in:",self.tip_enter_in)
  145.             pass
  146.         
  147.         elif self.tip_enter_in ==False:
  148.             print("--------正在离开widget",self.tip_enter_in)
  149.             self.hidetip()
  150.             self.tip_enter_in = False

  151.     def tip_enter(self,event):
  152.         "鼠标进入提示框"
  153.         self.tip_enter_in = True
  154.         #self.showtip()
  155.         
  156.     def get_tip_enter(self):
  157.         return self.tip_enter_in
  158.         

  159. root = Tk()
  160. lb = ttk.Label(root, text='测试 ToolTip', font=('',27))

  161. tooltip = ToolTip(lb,text='''您好!您好!\n\
  162. 您好!您好!您好!\n\
  163. 您好!您好!您好!您好!您好!\n\
  164. 您好!您好!您好!您好!您好!\n\
  165. 您好!您好!您好!您好!您好!\n\
  166. 您好!您好!您好!您好!您好!\n\
  167. 您好!您好!您好!您好!您好!\n\
  168. 您好!您好!您好!您好!您好!
  169. 您好!您好!您好!\n\
  170. 您好!您好!您好!您好!您好!\n\
  171. 您好!您好!您好!您好!您好!\n\
  172. 您好!您好!您好!您好!您好您好!\n\
  173. 您好!您好!您好!您好!\n\
  174. 您好!您好!您好!您好!您好!您好!您好!您好!您好!您好!\n\
  175. 您好!您好!您好!您好!您好!\n\
  176. 您好!您好!您好!您好!您好!\n\
  177. 您好!您好!您好!您好!您好!\n\
  178. 您好!您好!您好!您好!您好!\n\
  179. 您好!您好!您好!您好!您好!\n\
  180. 您好!您好!您好!您好!您好!\n\
  181. 您好!您好!您好!您好!您好!\n''')

  182. lb.pack()

  183. root.mainloop()
复制代码


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-11-18 17:32:47 | 显示全部楼层
有人帮忙看看吗,动动你可爱的小手
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-1 18:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表