Сделал свой 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()
@Goyo например 0
, если нет смещения. :)
Вы можете использовать метод yview()
, чтобы увидеть, полностью ли прокручен виджет. 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")
Из эффбот мы можем прочитать, что этот метод дает 4-кортеж, если символ виден, или None
, если символ не виден:
bbox(index)
Calculates the bounding box for the given character.This method only works if the text widget is updated. To make sure this is the case, you can call the update_idletasks method first.
index
Character index.
Returns:
A 4-tuple (x, y, width, height), or None, if the character is not visible.
Мы можем использовать это только для прокрутки, если последний символ был виден до того, как произошла вставка:
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)
Что бы вы хотели вернуть от
text.offsetBottom
?