如何自定义放置idlelib的Hovertip悬浮提示,解决位置显示异常问题
问题原因
- 你重写的
showtip方法仍然调用了父类的position_window(),该方法会按照默认逻辑将悬浮窗定位到锚点控件下方,覆盖了你自定义位置的逻辑 - 你传入的
x/y是鼠标相对于Treeview控件的坐标,直接给Label.place用的话,只是设置了Label在悬浮窗内部的位置,悬浮窗本身的全局位置并没有修改,还停留在默认位置 place布局不会自动触发父容器的尺寸自适应,悬浮窗保持了默认的大尺寸,Label只在内部偏移显示,视觉上就会出现大块空白区域
修复后的代码
首先修改AbsoluteHovertip类:
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 # 删除父类默认定位逻辑,计算悬浮窗的全局屏幕坐标 root_x = self.anchor_widget.winfo_rootx() + x + 10 root_y = self.anchor_widget.winfo_rooty() + y + 10 tw.wm_geometry(f"+{root_x}+{root_y}") self.showcontents() self.tipwindow.update_idletasks() self.tipwindow.lift() def showcontents(self): label = Label(self.tipwindow, text=self.text, justify=LEFT, background="#ffffe0", relief=SOLID, borderwidth=1) # Label直接放在悬浮窗左上角 label.place(x=0, y=0) # 让悬浮窗尺寸刚好适配Label大小 self.tipwindow.update_idletasks() self.tipwindow.wm_geometry(f"{label.winfo_reqwidth()}x{label.winfo_reqheight()}")
原有的Treeview调用逻辑不需要做修改。
内容的提问来源于stack exchange,提问作者demberto
相关产品推荐
相关产品推荐

