Я пытаюсь создать список, в котором отображается подсказка при наведении на него курсора, чтобы я мог создать класс, подобный следующему:
class CreateToolTip(object):
def __init__(self, widget, text='widget info'):
self.waittime = 300 # miliseconds
self.wraplength = 180 # pixels
self.widget = widget
self.text = text
self.widget.bind("<Enter>", self.enter)
self.widget.bind("<Leave>", self.leave)
self.widget.bind("<ButtonPress>", self.leave)
self.id = None
self.tw = None
self.disp_thread = Thread
def enter(self, event):
self.schedule()
global base_x, base_y
base_x, base_y = event.x_root, event.y_root
t = self.disp_thread(target=self.wait_and_disapr)
t.start()
def wait_and_disapr(self):
sleep(3.5)
self.hidetip()
def leave(self, event=None):
self.unschedule()
self.hidetip()
def schedule(self):
self.unschedule()
self.id = self.widget.after(self.waittime, self.showtip)
def unschedule(self):
id = self.id
self.id = None
if id:
self.widget.after_cancel(id)
def showtip(self, event=None):
x = y = 0
x, y, cx, cy = self.widget.bbox(0) # exception line
x += base_x
y += base_y
# creates a toplevel window
self.tw = tkinter.Toplevel(self.widget)
# Leaves only the label and removes the app window
self.tw.wm_overrideredirect(True)
self.tw.wm_geometry("+%d+%d" % (x, y))
label = tkinter.Label(self.tw, text=self.text, justify='left',
background="#ffffff", relief='solid', borderwidth=1,
wraplength=self.wraplength)
label.pack(ipadx=1)
def hidetip(self):
tw = self.tw
self.tw = None
if tw:
tw.destroy()
, затем инициализировать экземпляр с объектом Listbox:
lstbox = tkinter.Listbox(*args, **kwargs)
lstbox_tip = CreateToolTip(lstbox, text=tip_info)
Все шло хорошо, когда список не прокручивался по вертикали, подсказки отображались при перемещении курсора по списку, но когда я прокручивал список вниз, подсказки не отображались как обычно, и возникало следующее исключение:
> Traceback (most recent call last):
File "...\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1705, in __call__
return self.func(*args)
File "...\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 749, in callit
func(*args)
File "DYRecorder-ttkVersion4.0-distribution.py", line 617, in showtip
x, y, cx, cy = self.widget.bbox(0)
TypeError: cannot unpack non-iterable NoneType object
Кажется, что метод Listbox.bbox возвращает None после прокрутки списка. Есть ли решение этой проблемы?