Всплывающая подсказка не появляется при входе в событие - PullRequest
0 голосов
/ 03 октября 2019

Я написал собственный виджет tkinter, TooltipLabel. Когда курсор вводит метку, появляется всплывающий текстовый виджет, отображающий текст. На окнах это работает. Но как только я протестировал его на macos, всплывающая подсказка не всплыла, хотя метод для этого вызывался

. Я пытался использовать это решение , но это не помогло.

Вот PoC:

import math
import tkinter as tk
from tkinter import ttk

class Tooltip(object):
    """This widget adds a tooltip to a given widget, that displays when the cursor hovers over it"""
    def __init__(self, widget):
        self.widget = widget
        self.tooltip = None
        self.text = None
    #end init


    def show_tooltip(self, text):
        self.text = text
        if self.tooltip or not self.text:
            return

        x, y, cx, cy = self.widget.bbox("insert")
        x = x + self.widget.winfo_rootx() + 45
        y = y + cy + self.widget.winfo_rooty() + 30

        self.tooltip = tooltip_window = tk.Toplevel(self.widget)
        tooltip_window.wm_overrideredirect(1)   # removes the default window hide/maximize/close buttons
        tooltip_window.wm_geometry("+%d+%d" % (x, y))

        self._add_tooltip_text(tooltip_window)
    #end show_tooltip


    def hide_tooltip(self):
        tooltip_window = self.tooltip
        self.tooltip = None
        if tooltip_window:
            tooltip_window.destroy()
    #end hide_tooltip


    def _add_tooltip_text(self, tooltip_window):
        tooltip = tk.Text(tooltip_window, relief=tk.SOLID, width=40, wrap=tk.WORD)
        height = math.ceil(len(self.text) / 40) + self.text.count('\n')
        tooltip.insert(tk.END, self.text)
        tooltip.config(state=tk.DISABLED, height=height)
        tooltip.pack(ipadx=1)
    #end _add_tooltip_text
#end class Tooltip


def add_tooltip(widget, text):
    tooltip = Tooltip(widget)

    def enter(event):
        print(event)
        print(event.widget)
        print("Tooltip: %s" % text)
        tooltip.show_tooltip(text)
    #end enter

    def leave(event):
        tooltip.hide_tooltip()
    #end leave

    widget.bind('<Enter>', enter)
    widget.bind('<Leave>', leave)
#end add_tooltip

class TooltipLabel(ttk.Label):
    """This widget extends ttk.Label, and displays a tooltip when the cursor hovers over it"""
    def __init__(self, parent, tooltip_dict_key, **kwargs):
        ttk.Label.__init__(self, parent, **kwargs)

        self.parent = parent
        self.tooltip_text = None

        self.fetch_tooltip_text(tooltip_dict_key)
        add_tooltip(self, self.tooltip_text)
    #end init


    def fetch_tooltip_text(self, tooltip_dict_key):
        self.tooltip_text = "Testing tooltip"
    #end fetch_tooltip_text
#end class TooltipLabel



def main():
    root = tk.Tk()
    label = TooltipLabel(root, "tooltip_dict_key", text="testing")
    label.pack()

    root.mainloop()



if __name__ == "__main__":
    main()

Я бы ожидал, что всплывающая подсказка всплывет и отобразит текст «Подсказка для тестирования». Этого не происходит даже при возникновении события.

Вывод, который я получаю из операторов print:

<Enter event focus=False x=43 y=20>
.!tooltiplabel
Tooltip: Testing tooltip
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...