【问题标题】:Tkinter Tooltip over a text only in a text widget仅在文本小部件中的文本上的 Tkinter 工具提示
【发布时间】:2018-07-16 14:41:50
【问题描述】:

说明

我有一个包含一些文本的文本小部件。 我想要一个单词的工具提示。例如,对于特定单词,工具提示 #1 和其他工具提示 #2,依此类推。 当我尝试为单个单词创建一个工具提示时,它实际上为整个文本小部件创建了一个工具提示。我知道原因是因为我将 Text 小部件传递给了 HoverInfo 类。


我的问题:

  • 如何为文本小部件中的单词创建工具提示?
  • 是否可以为文本小部件中的不同单词动态定义多个工具提示?

我的描述代码:

from tkinter import *
import re
import tkinter as tk

class HoverInfo(Menu):
    def __init__(self, parent, text, command=None):
       self._com = command
       Menu.__init__(self,parent, tearoff=0)
       if not isinstance(text, str):
          raise TypeError('Trying to initialise a Hover Menu with a non string type: ' + text.__class__.__name__)
       toktext=re.split('\n', text)
       for t in toktext:
          self.add_command(label = t)
          self._displayed=False
          self.master.bind("<Enter>",self.Display )
          self.master.bind("<Leave>",self.Remove )

    def __del__(self):
       self.master.unbind("<Enter>")
       self.master.unbind("<Leave>")

    def Display(self,event):
       if not self._displayed:
          self._displayed=True
          self.post(event.x_root, event.y_root)
       if self._com != None:
          self.master.unbind_all("<Return>")
          self.master.bind_all("<Return>", self.Click)

    def Remove(self, event):
     if self._displayed:
       self._displayed=False
       self.unpost()
     if self._com != None:
       self.unbind_all("<Return>")

    def Click(self, event):
       self._com()



def HelloWorld():
    print('Hello World')


def vp_start_gui():
    global val, w, root, o
    root = Tk()
    canvas = tk.Canvas(root)
    scroll = tk.Scrollbar(root, orient='horizontal', command=canvas.xview)
    canvas.configure(xscrollcommand=scroll.set)
    frame = tk.Frame(canvas) # frame does not get pack() as it needs to be embedded into canvas throught canvas.
    scroll.pack(side='bottom', fill='x')
    canvas.pack(fill='both', expand='yes')
    canvas.create_window((0,0), window=frame, anchor='nw')
    frame.bind('<Configure>', lambda x: canvas.configure(scrollregion=canvas.bbox('all'))) # lambda function

    journal = tk.Text(frame, width = 75, height = 39)
    journal.configure(background="#f2f2f2")
    journal.configure(borderwidth="3")
    journal.configure(relief="groove")
    journal.grid() # grid instead
    journal.insert("end", "I want tooltip over this text only")    
    hover = HoverInfo(journal,'while hovering press return \n for an exciting msg', HelloWorld)


    root.mainloop()    


if __name__ == '__main__':
    vp_start_gui()

【问题讨论】:

    标签: python-3.x tkinter hover tooltip


    【解决方案1】:

    您可以将标签添加到文本小部件中的字符范围。然后,您可以将鼠标事件 &lt;Enter&gt;&lt;Leave. 绑定到这些标签。

    这是一个非常人为的例子:

    import tkinter as tk
    
    def show_info(text):
        label.configure(text=text)
    
    root = tk.Tk()
    text_widget = tk.Text(root)
    label = tk.Label(root)
    
    label.pack(side="top", fill="x")
    text_widget.pack(fill="both", expand=True)
    
    for color in ("red", "orange", "yellow", "green", "blue", "indigo", "violet"):
        tag = color
        text = color
        text_widget.insert("end", text+"\n", (tag, ))
    
        text_widget.tag_configure(tag, background=color, foreground="white")
        text_widget.tag_bind(tag, "<Enter>",
                             lambda event, color=color: show_info(color))
        text_widget.tag_bind(tag, "<Leave>",
                             lambda event, color=color: show_info(""))
    
    tk.mainloop()
    

    【讨论】:

    • 好的,我明白了。非常感谢。如果您能提供一个如何将标签绑定到 的示例,我将不胜感激。
    • 非常感谢。你能解释一下这条线吗? "text_widget.insert("end", text+"\n", (tag, ))" 。最后一个参数“(tag, ))”是什么。为什么第二个参数是空白的?
    • @RajMehta:它是一个元组。(tag) 在 python 中不是一个元组,它是一个表达式。 (tag,) 是一个元组。
    • 我明白了。非常感谢。
    • 我尝试了代码并且可以动态创建标签并为单个单词分配我想要的标签。但函数 show_info 只是配置标签以显示文本。我怎样才能将它作为工具提示?我尝试更改标签,但它会引发“Tkinter 异常错误”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    相关资源
    最近更新 更多