2

二分木の描画を理解しようとしています。私はで優れたスターターを見つけました

http://billmill.org/pymag-trees/

提供されているコードは、私が認識しているPythonライブラリの一部ではないグラフィック呼び出しを使用しているため、グラフィック呼び出しをtkinterに変換し、予期しない動作を除いてコードを実行しています。フレームのサイズを変更する(大きくする)と、ある時点でスクロールバーが置き去りになります。サイズを変更するときに、フレームにとどまりません。コードは次のとおりです。

from tkinter import *
from gen import Tree
from demo_trees import trees
from knuth import layout

r = 30
rh = r*1.5
rw = r*1.5

def drawt(canvas, root, depth):
    canvas.create_oval(root.x * rw, depth * rh, 
                   root.x * rw + r, depth * rh + r, 
                   fill = 'white',
                   width = 2)
    for child in root.children:
        drawt(canvas, child, depth+1)

def drawconn(canvas, root, depth):
    for child in root.children:
        canvas.create_line(root.x * rw + (r/2), depth * rh + (r/2),
         child.x * rw + (r/2), (depth+1) * rh + (r/2),
         width = 2)
        drawconn(canvas, child, depth+1)

def main():

    root = Tk()

    # Create the main frame. The frame will include a 
    # scrollable canvas.
    frame = Frame(root, width=500, height=309, relief=SUNKEN)
    frame.grid_rowconfigure(0, weight=1)
    frame.grid_columnconfigure(0, weight=1)

    # Add scroll bars
    xscrollbar = Scrollbar(frame, orient=HORIZONTAL)
    xscrollbar.grid(row=1, column=0, sticky=E+W)

    yscrollbar = Scrollbar(frame)
    yscrollbar.grid(row=0, column=1, sticky=N+S)

    # Add the canvas
    canvas = Canvas(frame, width=500, height=300,
                scrollregion=(-20, -20, 500, 300),
                xscrollcommand=xscrollbar.set,
                yscrollcommand=yscrollbar.set)

    canvas.grid(row=0, column=0, sticky=N+S+E+W)

    xscrollbar.config(command=canvas.xview)
    yscrollbar.config(command=canvas.yview)

    frame.pack()

    # Now draw the tree
    t = layout(trees[2])
    drawconn(canvas, t, 0)
    drawt(canvas, t, 0)

    root.mainloop()

if __name__ == '__main__':
    main()

図面は適切にスクロールしており、フレームのサイズが変更されるまで(大きく)すべてが正常です。スクロールバーがフレームと一緒に移動しない理由を誰かに教えてもらえますか?

興味のある方は、完全なツリー描画コードは上記のリンクからのものであり、提供されているダウンロードのfigure2.pyのコードに対応しています。

4

1 に答える 1

1

依存関係がないためにコードを実行できないため、確実に言うのは難しいですが、推測する必要がある場合は、フレームが伸縮するようにフレームをパックしていないためだと言えます。スクロールバーが「取り残される」と言いますが、キャンバスにも同じ問題があるに違いありません。

フレームをパックする行を次のように変更してみてください。

frame.pack(side="top", fill="both", expand=True)
于 2012-12-20T12:17:51.633 に答える