【问题标题】:Python: Scroll a ScrolledText automatically to the end if the user is not scrolling manuallyPython:如果用户没有手动滚动,则自动将 ScrolledText 滚动到末尾
【发布时间】:2019-01-17 18:12:48
【问题描述】:

我根据this answerScrolledText 自动滚动 到最后。

现在我想仅在用户不手动滚动时自动滚动。

我一直在寻找类似这样的东西: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()

【问题讨论】:

  • 你希望text.offsetBottom返回什么?
  • @Goyo 例如0 如果没有偏移量。 :)

标签: python python-2.7 user-interface tkinter


【解决方案1】:

您可以使用yview() 方法查看小部件是否完全向下滚动。 yview() 返回一个 2 元组,其中可见部分的顶部和底部相对于总大小。所以如果小部件完全向下滚动,第二个数字应该是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 方法。

索引
字符索引。
退货:
如果字符不可见,则为 4 元组(x、y、宽度、高度)或 None。

如果最后一个字符在插入发生之前可见,我们可以使用它来滚动:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 2023-02-23
    • 2017-10-05
    • 2011-11-28
    • 1970-01-01
    相关资源
    最近更新 更多