Привет. Я пытаюсь создать кнопки Tkinter, у которых всплывающая подсказка.Я хочу, чтобы всплывающая подсказка задерживалась при вводе и отображалась только в течение определенного времени.Я использую многопоточность для отображения всплывающей подсказки, чтобы не блокировать нажатие кнопки.Я, кажется, очень близок к решению, но есть проблема, которая, я думаю, связана с потоками.Подсказка представляет собой окно верхнего уровня без каких-либо оконных декораций (строка заголовка, границы и т. Д.).При вводе кнопки всплывающая подсказка отображается, но иногда она имеет декорации, а иногда ее нет, иногда она отображается в правильном положении, а иногда нет.Я понятия не имею, почему происходит такое поведение, ниже я разместил тестовый код, который я использую для решения этой проблемы, но теперь я потерян, любая помощь будет принята с благодарностью.
from time import sleep
from tkinter import Tk, Button, Label, Toplevel
from threading import Thread
class _Button(Button):
def __init__(self, parent, *args, **kwargs):
self.tooltip_text = kwargs.pop('tooltip', None)
super().__init__(*args, **kwargs)
self.t = None
self.parent = parent
self.btn_tooltip = None
def tooltip(self):
if not self.t:
self.t = Thread(target=self.tooltip_render)
self.t.start()
def tooltip_render(self):
sleep(0.5)
if not self.btn_tooltip:
self.btn_tooltip = Toplevel()
self.btn_tooltip.wm_overrideredirect(True)
x, y, cx, cy = self.bbox('insert')
x += self.winfo_rootx() + 25
y += self.winfo_rooty() + 25
self.btn_tooltip.geometry('+%d+%d' % (x, y))
label = Label(
self.btn_tooltip, text=self.tooltip_text, background='yellow', borderwidth=1,
)
label.pack(ipadx=5, ipady=2)
sleep(1)
if self.btn_tooltip:
self.btn_tooltip.destroy()
self.btn_tooltip = None
self.t = None
def enter(e):
e.widget.tooltip()
def leave(e):
if e.widget.btn_tooltip:
e.widget.btn_tooltip.destroy()
e.widget.btn_tooltip = None
e.widget.t = None
root = Tk()
bt1 = _Button(root, text='Button 1', tooltip='Tooltip1')
bt1.bind('<Enter>', enter)
bt1.bind('<Leave>', leave)
bt1.grid()
bt2 = _Button(root, text='Button 2', tooltip='Tooltip2')
bt2.bind('<Enter>', enter)
bt2.bind('<Leave>', leave)
bt2.grid(row=0, column=1)
root.mainloop()