使用ttk.Treeview,如何让水平滚动按预期工作?

时间:2012-11-03 03:41:23

标签: python treeview scrollbar ttk

使用这个Python脚本,这是我第一次尝试学习ttk.Treeview如何工作(autoscroll的额外副本只是为了分割水平和垂直回调):

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()

我看到以下行为:当我第一次运行程序时,输出如下所示: initial state

如果我展开窗口直到水平滚动条关闭,它看起来像这样:last just goes to 1.0

如果我继续展开窗口,则显示以下所有文字: closed item width

我的第一个问题是,如何让xscrollcommand识别文字的实际宽度,而不是使用minwidth的值?

回到第二张图片中的状态,如果我打开该项目,则转到:vscroll on

我的第二个问题与第一个问题几乎相同。如何在项目打开后识别项目的新宽度?

如果我将minwidth=400更改为width=400,则不会显示水平滚动条。

总结:虽然垂直滚动条按照我的预期工作并对显示的实际文本行做出反应(而不是高度的ttk.Treeview设置),但水平滚动条似乎只关心{的值{1}}。我想过使用类似下面的东西,特别是如果有minwidth主题小部件的等价物。但是,ttk的设置在填充树后不会生效,尽管我可以在此时更改宽度值。有没有办法强制改变minwidth

minwidth

抱歉额外的窗口; Tkinter的这一部分让我感到困惑......

0 个答案:

没有答案