Метод tkinter Listbox.bbox возвращает None после прокрутки списка - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь создать список, в котором отображается подсказка при наведении на него курсора, чтобы я мог создать класс, подобный следующему:

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 после прокрутки списка. Есть ли решение этой проблемы?

1 Ответ

0 голосов
/ 23 апреля 2020

Благодаря комментарию и пояснениям @Bryan Oakley, полученным по этой ссылке , я получил подсказку, которую нужно показать, когда listbox прокручивается путем изменения метода showtip (), вот что я добавляю:

def showtip(self, event=None):
        x = y = 0
        index_lst = [0, 4, 8, 12, 16]  # my listbox has 20 elements
        for index in index_lst :
            if self.widget.bbox(page):
                x, y, cx, cy = self.widget.bbox(page)
                break
        x += base_x
        y += base_y
        self.tw = tkinter.Toplevel(self.widget)
        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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...