Hovertip
的当前implementation,压缩一个Label
。我重写了Hovertip
类,将其相对于鼠标位置放置如下:
class AbsoluteHovertip(Hovertip):
def __init__(self, anchor_widget, text):
super().__init__(anchor_widget, text)
def showtip(self, x, y):
if self.tipwindow:
return
self.tipwindow = tw = Toplevel(self.anchor_widget)
tw.wm_overrideredirect(1)
try:
tw.tk.call("::tk::unsupported::MacWindowStyle", "style", tw._w,
"help", "noActivates")
except TclError:
pass
self.position_window()
self.showcontents(x, y)
self.tipwindow.update_idletasks()
self.tipwindow.lift()
def showcontents(self, x, y):
label = Label(self.tipwindow, text=self.text, justify=LEFT,
background="#ffffe0", relief=SOLID, borderwidth=1)
label.place(x=x+10, y=y+10)
我在Treeview
中这样使用它:
# self.tv is Treeview
# self.htip is AbsoluteHovertip(self.tv, "")
# self.events is just a list
def treeview_tooltip(self, event):
row = self.tv.identify_row(event.y)
column = self.tv.identify_column(event.x)
values = self.tv.item(row, "values")
if column == "#2":
index = int(values[0])
ev = self.events[index]
self.htip.text = int(ev.id)
self.htip.showtip(event.x, event.y)
elif column == "#3":
text = values[2]
if len(text) >= 30:
self.htip.text = text
self.htip.showtip(event.x, event.y)
else:
self.htip.hidetip()
self.tv.tk.call(self.tv, "tag", "remove", "highlight")
self.tv.tk.call(self.tv, "tag", "add", "highlight", row)
然而,与预期的不同,一个大约100x100或更大的方形框显示在Treeview
下方,与正常的HoverTip
出现的位置相同。
1条答案
按热度按时间bkhjykvo1#
我一直在研究这个问题,你的
showtip
覆盖给了我一个想法。在showtip
中有一个对position_window
的调用,所以我覆盖了它,并且能够改变提示窗口的位置。你也可以用self.tipwindow.geometry()
来做(可能在任何覆盖)如果你能得到正确的位置,你需要的。我需要相对重新定位,所以覆盖position_window
对我来说工作得很好。下面我将根据锚小部件的宽度重新定位tipwindow
,并且重载了showcontents
,以便可以设置提示窗口的样式。