複数のシリアル プロトコルを理解するデバイスがあります。開発中に、プロトコルを操作するためのシンプルな 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 の初心者なので、「明らかな」何かを見逃した場合は優しくしてください。
ティア!