python 如何放置idlelib气垫船?

sczxawaw  于 2023-02-02  发布在  Python
关注(0)|答案(1)|浏览(101)

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出现的位置相同。

bkhjykvo

bkhjykvo1#

我一直在研究这个问题,你的showtip覆盖给了我一个想法。在showtip中有一个对position_window的调用,所以我覆盖了它,并且能够改变提示窗口的位置。你也可以用self.tipwindow.geometry()来做(可能在任何覆盖)如果你能得到正确的位置,你需要的。我需要相对重新定位,所以覆盖position_window对我来说工作得很好。下面我将根据锚小部件的宽度重新定位tipwindow,并且重载了showcontents,以便可以设置提示窗口的样式。

class Tip(Hovertip):
    def position_window(self):
        """(re)-set the tooltip's screen position"""
        x, y = self.get_position()
        root_x = self.anchor_widget.winfo_rootx() + x - self.anchor_widget.winfo_width()
        root_y = self.anchor_widget.winfo_rooty() + y
        self.tipwindow.wm_geometry("+%d+%d" % (root_x, root_y))

    def showcontents(self):
        label = Label(self.tipwindow, text=self.text, justify=LEFT,
                      relief=SOLID, font=("Segoe UI", 12), borderwidth=0,
                      background=background, foreground=foreground,
                      padx=10, pady=10)
        label.pack()

Tip(set_btn, "Settings", hover_delay=0)

相关问题