我想创建一个函数,当用户处于滚动条上的特定位置时,我们可以自动激活。这就像我想创建一个结果页面,当用户离终点有点远时,它会自动加载更多结果,但我不知道如何自动获取它。我可以使用scrollbar.get方法获取scollbar的位置,但是如何检查用户何时移动scollbar?
如果仅在他们使用滚动条时才需要此特殊行为,而不是在他们使用向上翻页、向下翻页或鼠标滚轮时,则可以让滚动条调用代理,而不是文本小部件的yview
方法。
代理需要正常调用 yview
命令,然后它可以执行自动加载功能。
您可以获取最后一个可见行的索引,然后将其与目标行进行比较,例如倒数第五行。如果最后一个可见行超过目标,请加载另一个页面。
例:
import tkinter as tk
COUNT = 0
def handle_scroll(*args):
# call the yview command to update the text widget based
# on the scrollbar position
text.yview(*args)
# load another page if the user scrolls to within 5 lines
# of the end
maxy = text.winfo_height()
last_visible_line = text.index("@0,{} linestart".format(maxy))
target = text.index("end-5 lines")
if text.compare(last_visible_line, ">", target):
load_page()
def load_page():
"""Simulate adding a page of results"""
global COUNT
for i in range(30):
COUNT += 1
text.insert("end", "Result #{}n".format(COUNT))
root = tk.Tk()
vsb = tk.Scrollbar(root, orient="vertical", command=handle_scroll)
text = tk.Text(root,height=20, yscrollcommand=vsb.set)
vsb.pack(side="right", fill="y")
text.pack(side="left", fill="both", expand=True)
# simulate loading the initial page
load_page()
tk.mainloop()
注意:如果您想要此自动加载功能,无论用户如何滚动小部件(滚动条,鼠标滚轮,键盘(,请使用代理代替vsb.set
而不是代替text.yview
。这样,每次小部件的内容更改或滚动时都会调用该函数。