4

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

次の動作が見られます。プログラムを最初に実行したとき、出力は次のようになります 初期状態

水平スクロールバーが消えるまでウィンドウを拡大すると、次のようになります。最後はちょうど1.0になります

ウィンドウを拡大し続けると、次のすべてのテキストが表示されます。 閉じたアイテムの幅

xscrollcommand私の最初の質問は、の値を使用するのではなく、テキストの実際の幅を認識するにはどうすればよいminwidthですか?

2 番目の画像の状態に戻り、アイテムを開くと、次のようになります。vsスクロールオン

2 番目の質問は、最初の質問とほとんど同じです。アイテムを開いた後にアイテムの新しい幅を認識させるにはどうすればよいですか?

に変更minwidth=400するwidth=400と、水平スクロールバーが表示されなくなります。

要約: 垂直スクロールバーは期待どおりに機能し、(高さの設定ではなくttk.Treeview) 表示されている実際のテキスト行に反応しますが、水平スクロールバーは の値のみを気にしているようですminwidthttk特にテーマ付きウィジェットに相当するものがある場合は、以下のようなものを使用することを考えました。minwidthただし、その時点で幅の値を変更することはできますが、ツリーにデータを入力した後はの設定は有効になりません。への変更を強制する方法はありminwidthますか?

minwidth=tkFont.Font().measure(text)
self.tree.column('#0', minwidth=tcw)

余分なウィンドウで申し訳ありません。Tkinterのその部分は私を際限なく混乱させます...

4

0 に答える 0