当滚动条位于用户近一半的位置时如何自动获取滚动条的位置,以便可以调用其他功能?

时间:2019-07-13 20:34:40

标签: tkinter tkinter-canvas

我想创建一个可以在用户位于滚动条上的特定位置时自动激活的功能,就像我想创建一个结果页面,当用户离终点不远时会自动加载更多结果但是我不知道如何自动获取它。我可以使用scrollbar.get方法获取scollbar的位置,但是如何检查用户何时移动了scollbar?

1 个答案:

答案 0 :(得分:0)

如果仅当他们使用滚动条而不是使用上一页,下一页或鼠标滚轮时才希望这种特殊行为,则可以让滚动条调用代理而不是文本小部件的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而不是{{1} }。这样,每次小部件的内容更改或滚动时,都会调用该函数。