在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/