4

複数のシリアル プロトコルを理解するデバイスがあります。開発中に、プロトコルを操作するためのシンプルな Tkinter UI を作成しました。各プロトコルに新しい UI が追加されました。プロトコルには多くのコマンドがあるため、スクロール可能なキャンバス内に UI 全体を実装して、小さなディスプレイで使用するときにスクロールできるようにしました。個別の UI は正常に機能し、個別の UI をタブ付きの UI に結合しようとしています。

各 UI の共通要素はシリアル ポート セレクターで、これを分離して別のトップ フレームに配置しました。次に、ノートブックを実装し、各プロトコル UI を各タブのフレームに配置しました。

しかし、サイズを適切に制御できません。ルート ウィンドウの幅を、プロトコル フレームまたはシリアル セレクター フレームの最大幅に固定し、水平方向のサイズ変更を無効にしたいのです。シリアルセレクターが常に存在し、ウィンドウが垂直方向にサイズ変更されても影響を受けないようにしたい (ノートブックのみがサイズ変更/スクロールされる)。

以下は私がこれまでに持っているものです。すべてのピースが存在しますが、ノートブックはウィンドウの幅全体を埋めません。また、ウィンドウのサイズを変更してもノートブックのサイズは変更されません (サイズ変更すると空白が追加されるだけです)。

def main():
    ## Main window
    root = Tkinter.Tk()
    root.title("Multi-Protocol UI")

    ## Grid sizing behavior in window
    root.grid_rowconfigure(0, weight=0)
    root.grid_rowconfigure(1, weight=1)
    root.grid_columnconfigure(0, weight=1)
    root.grid_columnconfigure(1, weight=0)

    ## Window content
    upper = ttk.Frame(root)   # Serial port selector
    upper.grid(row=0)
    upper.grid_rowconfigure(0, weight=0)
    upper.grid_columnconfigure(0, weight=1)
    upper.grid_columnconfigure(1, weight=0)
    lower = ttk.Frame(root)   # For protocols
    lower.grid(row=1)
    lower.grid(row=1, sticky='nswe')
    lower.grid_rowconfigure(0, weight=1)
    lower.grid_columnconfigure(0, weight=1)
    lower.grid_columnconfigure(1, weight=0)

    # Setup serial control frame
    serial = SerialFrame(master=upper)  # Serial port selector widget + Open button

    ## Protocol GUIs are large: Use a form within a scrollable canvas.
    cnv = Tkinter.Canvas(lower)
    cnv.grid(row=0, column=0, sticky='nswe')
    cnv.grid_rowconfigure(0, weight=1)
    cnv.grid_columnconfigure(0, weight=1)
    cnv.grid_columnconfigure(1, weight=0)
    # Scrollbar for canvas
    vScroll = Tkinter.Scrollbar(
        lower, orient=Tkinter.VERTICAL, command=cnv.yview)
    vScroll.grid(row=0, column=1, sticky='ns')
    cnv.configure(yscrollcommand=vScroll.set)
    # Frame in canvas
    window = Tkinter.Frame(cnv)
    window.grid()
    # Put the frame in the canvas's scrollable zone
    cnv.create_window(0, 0, window=window, anchor='nw')

    # Setup the notebook (tabs) within the scrollable window
    notebook = ttk.Notebook(window)
    frame1 = ttk.Frame(notebook)
    frame2 = ttk.Frame(notebook)
    notebook.add(frame1, text="ProtoA")
    notebook.add(frame2, text="ProtoB")
    notebook.grid(row=0, column=0, sticky='nswe')

    # Create tab frames
    protoA = ProtoAFrame(master=frame1)
    protoA.grid()
    protoA.update_idletasks()
    protoB = ProtoBFrame(master=frame2)
    protoB.grid()
    protoB.update_idletasks()

    ## Update display to get correct dimensions
    root.update_idletasks()
    window.update_idletasks()
    ## Configure size of canvas's scrollable zone
    cnv.configure(scrollregion=(0, 0, window.winfo_width(), window.winfo_height()))

    # Not resizable in width:
    root.resizable(width=0, height=1)

    ## Go!
    root.mainloop()

上部のシリアル フレームを固定し、ノートブックを全幅に拡張し、ウィンドウのサイズ変更を強制してノートブック フレームのみに適用するにはどうすればよいですか? 私は Tkinter の初心者なので、「明らかな」何かを見逃した場合は優しくしてください。

ティア!

4

1 に答える 1

6

ウィジェット内にネストされたウィジェットがあります。ノートブックがコンテナー内で適切に展開するように設定されている場合でも、すべてのコンテナーが上向きに適切に展開されることも確認する必要があります。あなたはそれをしていません。たとえば、キャンバスが の中で適切に拡大するように設定されているかどうかを自問してくださいlower

始めたばかりなので、こちらがオススメです。すべてを一度に解決しようとするのではなく、「分割統治」アプローチを選択してください。まず、GUI の主要な領域のフレームを作成します。それらのフレームだけを実行し、サイズ変更動作を正確に希望どおりにします。この段階で、それぞれに独自の色を付けると、ウィジェットがどこにあるかがはっきりとわかるようになります。後でいつでも色を変更できます。また、ウィジェットが 2 つしかない場合、またはすべてのウィジェットが水平方向または垂直方向に配置されている場合、グリッドよりもパックの方が使いやすいことがよくあります。

例えば:

upper.pack(side="top", fill="x", expand=False)
lower.pack(side="bottom", fill="both", expand=True)

これらの主要な部分のサイズを適切に変更したら、これらの領域の 1 つだけの問題を解決します。エリアを選択し、同じことを行います。その子ウィジェットを追加するか、エリア内にエリアがある場合はフレームに分割します。これが機能したら、泡立てて、すすぎ、繰り返します。

于 2012-11-19T17:50:04.193 に答える