【问题标题】:Screen updates slowly using Tkinter Scrollbar使用 Tkinter 滚动条缓慢更新屏幕
【发布时间】:2021-09-06 17:56:53
【问题描述】:

当我运行此代码并抓住滚动条并快速上下移动时,屏幕加载屏幕上的项目非常慢。有什么办法可以加快屏幕更新内容的“刷新率”吗?

import tkinter as tk

root = tk.Tk()
container = tk.Frame(root)
canvas = tk.Canvas(container)
scrollbar = tk.Scrollbar(container, orient="vertical", command=canvas.yview)
scrollable_frame = tk.Frame(canvas)

scrollable_frame.bind("<Configure>",lambda e: canvas.configure(scrollregion=canvas.bbox("all")))

canvas.create_window((0, 0), window=scrollable_frame, anchor="nw")

canvas.configure(yscrollcommand=scrollbar.set)
row=0

for i in range(100):
    tk.Label(scrollable_frame, text='test').grid(row=row, column=1)
    tk.Label(scrollable_frame, text='test1').grid(row=row, column=2)
    tk.Label(scrollable_frame, text='random').grid(row=row, column=3)
    tk.Label(scrollable_frame, text='random1').grid(row=row, column=4)
    tk.Label(scrollable_frame, text='random2').grid(row=row, column=5)
    tk.Button(scrollable_frame, text='button').grid(row=row, column=6)
    row=row+1

container.pack()
canvas.pack(side="left", fill="both", expand=True)
scrollbar.pack(side="right", fill="y")

root.mainloop()

【问题讨论】:

  • 你为什么要创建这么多小部件?很少需要超过 100 个小部件。现在您正在尝试创建 600 个小部件。我建议你重新设计你的程序。如果你真的需要制作那么多小部件,请使用.after() 来分块创建它们。
  • @TheLizzard 我的实际应用程序正在从 SQL 数据库中获取数据并将其呈现给用户。有时结果很长,需要 600 多个结果。我将如何将 .after() 合并到其中以使滚动更顺畅?谢谢

标签: python python-3.x tkinter


【解决方案1】:

你有一个设计缺陷。您永远不需要超过 100 个小部件。

但如果你真的需要这么多小部件,试试这个:

import tkinter as tk

root = tk.Tk()
container = tk.Frame(root)
canvas = tk.Canvas(container)
scrollbar = tk.Scrollbar(container, orient="vertical", command=canvas.yview)
scrollable_frame = tk.Frame(canvas)

scrollable_frame.bind("<Configure>",lambda e: canvas.configure(scrollregion=canvas.bbox("all")))

canvas.create_window((0, 0), window=scrollable_frame, anchor="nw")

canvas.configure(yscrollcommand=scrollbar.set)

def create_widgets(row:int=0) -> None:
    # If row == 100 stop the loop
    if row == 100:
        return None

    tk.Label(scrollable_frame, text='test').grid(row=row, column=1)
    tk.Label(scrollable_frame, text='test1').grid(row=row, column=2)
    tk.Label(scrollable_frame, text='random').grid(row=row, column=3)
    tk.Label(scrollable_frame, text='random1').grid(row=row, column=4)
    tk.Label(scrollable_frame, text='random2').grid(row=row, column=5)
    tk.Button(scrollable_frame, text='button').grid(row=row, column=6)

    # Change the 10 to something smaller if you want it to be faster.
    # But keep it above 3
    root.after(10, create_widgets, row+1)

create_widgets()

container.pack()
canvas.pack(side="left", fill="both", expand=True)
scrollbar.pack(side="right", fill="y")

root.mainloop()

它消除了首次创建小部件时的延迟。它使用由.after 脚本组成的for 循环。更多信息请关注here

没有办法解决您遇到的滚动问题。 tkinter 不是为处理那么多小部件而构建的。

【讨论】:

  • 这似乎有助于滚动,直到我滚动到底部,然后它是相同的。所以基本上你说一旦有那么多小部件被加载到屏幕上,就没有办法让滚动更流畅,至少使用 tkinter?
  • 我将尝试将 5 个标签组合成 1 个更大的标签,以限制 tkinter 必须创建和显示的小部件数量,看看是否有帮助。感谢您的建议。
  • @Lzypenguin 结合标签肯定会更好。
猜你喜欢
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 2019-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多