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

Posted

技术标签:

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

我根据this answer 将ScrolledText 自动滚动 到最后。

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

我一直在寻找类似这样的东西: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 如果没有偏移量。 :) 【参考方案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)

【讨论】:

以上是关于Python:如果用户没有手动滚动,则自动将 ScrolledText 滚动到末尾的主要内容,如果未能解决你的问题,请参考以下文章

如何不让mysql每次开机时自动启动

如何自动滚动到底部,如果在底部则滚动到顶部

自动滚动时 UIScrollView 触摸不起作用

UIScrollView 问题

如何禁用 Logcat 中的自动滚动功能?

Microsoft office2007 ppt如何设置手动播放和自动播放