鱼C论坛

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

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

[复制链接]
发表于 2020-11-11 18:13:58 | 显示全部楼层 |阅读模式
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()

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-17 21:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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