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 滚动到末尾的主要内容,如果未能解决你的问题,请参考以下文章