Python 3 tkinter x 使用箭头滚动非常慢

标签 python tkinter treeview scrollbar

在Python 3.x中,使用水平滚动条和ttk TreeView ,通过单击箭头进行x滚动非常非常慢,每秒几个像素,我不知道如何解决这个问题,这是我制作的一个最小示例:

import tkinter as tk
from tkinter import ttk

app = tk.Tk()
t = ttk.Treeview(app)
t.pack(side="top",fill="both",expand=1)
xscroll = tk.Scrollbar(app,command=t.xview,orient="horizontal")
t.configure(xscrollcommand=xscroll.set)
xscroll.pack(side="top",fill="x")

tcols = ["header " + str(i)
         for i in range(50)]
t.config(columns=tcols)
for h in tcols:
    t.heading(h,text=h)

for i in range(5):
    t.insert("","end",
             text = "item" + str(i),
             values = ["value" + str(x) for x in range(49)])
app.geometry("{}x{}".format(800, 600))

箭头点击滚动很慢,使用栏拖动还好

最佳答案

琐事:

您需要知道的是,XView“mix-in”类的 xview 方法只是另一个回调,其行为根据用户交互而有所不同:

  • 如果用户拖动滚动条 slider xview 会被调用为 xview(self, *('moveto', some_offset))

  • 如果用户在槽中点击xview 会被调用为 xview(self, *('scroll', some_step, 'pages' ))

  • 如果用户单击箭头xview 会被调用为 xview(self, *('scroll', some_step, 'units') )

如您所见 - 没那么复杂!事实上,您的问题在于,在最后一种情况下,some_step始终是 1 或 -1 字符串值,因此您只需将其相乘即可值乘以一些乘数。简单易行!

解决方案:

作为一种解决方案,我在这里看到的最轻量级的方法创建了一个派生类,它继承自 ttk.Treeview 并重写了 xview 方法。

在您的程序中尝试这个Treeview:

class CustomTreeview(ttk.Treeview):
    def __init__(self, parent, *args, **kwargs):
        ttk.Treeview.__init__(self, parent, *args, **kwargs)
        self.vanilla_xview = tk.XView.xview

    def xview(self, *args):
        #   here's our multiplier
        multiplier = 100

        if 'units' in args:
            #   units in args - user clicked the arrows
            #   time to build a new args with desired increment
            mock_args = args[:1] + (str(multiplier * int(args[1])),) + args[2:]
            return self.vanilla_xview(self, *mock_args)
        else:
            #   just do default things
            return self.vanilla_xview(self, *args)

关于Python 3 tkinter x 使用箭头滚动非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46226070/

相关文章:

python - 当绘制在强度之上时,颤抖图会发生变化

python - pandas pct_change() 函数返回错误值

python - 安装 gruobipy 包 - 错误

python - Tkinter Entry - 当字段为空时输入新值时出现错误消息

python - 如何将 'for i in range(x)' 中的 i 附加到 python 中的标签?

javascript - 在 d3js 树布局中将类添加到根节点

python - "subtracting"字符串,python 中的类

ASP.NET TreeView 性能

delphi - 在开发者表达组件 cxTreeView 中存储额外数据

python - Tkinter 中的非阻塞信息对话框