使用这个 Python 脚本,这是我第一次尝试学习如何ttk.Treeview
工作(自动滚动的额外副本只是为了拆分水平和垂直回调):
import Tkinter as tk
import ttk
class Test():
def __init__(self, parent=None):
self.win = tk.Toplevel()
self.win.grid_columnconfigure(0, weight=1)
self.win.grid_rowconfigure(0, weight=1)
self.treeFrame = ttk.LabelFrame(self.win, text='Test Scrolling tk.Treeview')
self.treeFrame.grid(row=0, column=0, padx=5, pady=5, sticky='nsew')
self.treeFrame.grid_columnconfigure(0, weight=1)
self.treeFrame.rowconfigure(0, weight=1)
def autoscrollv(sbar, first, last):
print 'vert first:%s, last:%s' % (first,last)
first, last = float(first), float(last)
if first <= 0 and last >= 1:
sbar.grid_remove()
else:
sbar.grid()
sbar.set(first, last)
def autoscrollh(sbar, first, last):
print 'horz first:%s, last:%s' % (first,last)
first, last = float(first), float(last)
if first <= 0 and last >= 1:
sbar.grid_remove()
else:
sbar.grid()
sbar.set(first, last)
vsb = ttk.Scrollbar(self.treeFrame, orient="vertical")
hsb = ttk.Scrollbar(self.treeFrame, orient="horizontal")
self.tree = ttk.Treeview(self.treeFrame, height=10,
yscrollcommand=lambda f, l: autoscrollv(vsb, f, l),
xscrollcommand=lambda f, l: autoscrollh(hsb, f, l))
self.tree.column("#0", minwidth=400, stretch=True)
vsb['command'] = self.tree.yview
hsb['command'] = self.tree.xview
self.tree.grid(row=0, column=0, sticky='nsew')
vsb.grid(column=1, row=0, sticky='ns')
hsb.grid(column=0, row=1, sticky='ew')
self.tree.insert('', 'end', 'xyz', text='abc'*20)
for i in range(30):
self.tree.insert('xyz', 'end', text='%s' % i + 'xyz'*40)
self.win.mainloop()
if __name__ == "__main__":
test = Test()
我看到以下行为:当我第一次运行程序时,输出如下所示: .
如果我展开窗口直到水平滚动条关闭,它看起来像这样:
如果我继续展开窗口,这里是显示的所有文本:
我的第一个问题是,我怎样才能xscrollcommand
识别文本的实际宽度,而不是使用 for 的值minwidth
?
回到第二张图片中的状态,如果我打开该项目,它会变成这样:
我的第二个问题与第一个问题几乎相同。打开后如何让它识别项目的新宽度?
如果我更改minwidth=400
为width=400
,水平滚动条永远不会出现。
总结:虽然垂直滚动条按我的预期工作并对正在显示的实际文本行做出反应(而不是ttk.Treeview
高度的设置),但水平滚动条似乎只关心minwidth
. 我想过使用类似下面的东西,特别是如果有ttk
主题小部件的等价物。但是,在填充树后,设置minwidth
不会生效,尽管我可以在那时更改宽度的值。有没有办法强制改变minwidth
?
minwidth=tkFont.Font().measure(text)
self.tree.column('#0', minwidth=tcw)
对不起,额外的窗口;Tkinter 的那部分让我无休止地困惑......