tkinter Listbox.bbox方法在滚动列表框后返回None

问题描述 投票:0回答:1

我正在尝试创建一个在将光标移到列表框时显示提示的列表框,以使我能够创建这样的类:

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。这个问题有解决方案吗?

python tkinter listbox
1个回答
0
投票

感谢@Bryan Oakley在此link中的评论和解释,通过修改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)
© www.soinside.com 2019 - 2024. All rights reserved.