代码之家  ›  专栏  ›  技术社区  ›  Mr. B.

Python:如果用户不手动滚动,则自动将ScrolledText滚动到末尾

  •  -1
  • Mr. B.  · 技术社区  · 6 年前

    我做了我的 ScrolledText 最后,基于 this answer .

    现在我想自动滚动 用户是 不手动滚动 .

    我在找这样的东西: self.text.offsetBottom (见下面代码中的我的评论)

    import time
    from Tkinter import *
    import ScrolledText
    
    class Example(Frame):
        def __init__(self, *args, **kwargs):
            Frame.__init__(self, *args, **kwargs)
    
            self.text = ScrolledText.ScrolledText(self, height=6, width=40)
            self.text.pack(side="left", fill="both", expand=True)
            self.add_timestamp()
    
        def add_timestamp(self):
            self.text.insert("end", time.ctime() + "\n")
    
            """ -----> HERE <----- """         
            # if self.text.offsetBottom > 0:
            self.text.see("end")
            self.after(1000, self.add_timestamp)
    
    if __name__ == "__main__":
        root =Tk()
        frame = Example(root)
        frame.pack(fill="both", expand=True)
        root.mainloop()
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   fhdrsdg    6 年前

    你可以使用 yview() 方法查看小部件是否完全向下滚动。 伊维尤() 1.0 .

    我们只能在小部件在插入之前完全向下滚动时使用此选项:

    def add_timestamp(self):
        fully_scrolled_down = self.text.yview()[1] == 1.0
        self.text.insert("end", time.ctime() + "\n")
        if fully_scrolled_down:
            self.text.see("end")
        self.after(1000, self.add_timestamp)
    

    visible = self.text.bbox("end-1c")
    

    effbot ,我们可以看到,如果字符可见,则此方法提供一个4元组,或者 None

    bbox(索引)
    计算给定字符的边界框。

    此方法仅在文本小部件更新时有效。要确保是这种情况,可以先调用update_idletasks方法。

    指数

    返回:
    四元组(x,y,width,height)或无,如果字符不可见。

    只有在插入前最后一个字符可见时,我们才能使用此选项滚动:

    def add_timestamp(self):
        last_char_visible= self.text.bbox("end-1c")
        self.text.insert("end", time.ctime() + "\n")
        if last_char_visible:
            self.text.see("end")
        self.after(1000, self.add_timestamp)