私のコードはフレーム、フレーム内のキャンバス、キャンバス内の内側のフレームを持っています。 Entryウィジェットのwidthオプションでピクセル/フォント幅の変換を避けるために、内部フレームの内側にEntryボックスを入れ、内側のFrameにpack_propagate(0)
でフィットさせたい。しかし、これは内部フレームのスクロール機能を破壊します。私は現在、pack(before=)
を使って行っている内部フレームの最初と最後のエントリウィジェットの上下にEntryウィジェットを動的に追加したいと考えています。だから私は可能ならパッカーに固執したいと思います。pack_propagate(0)の宣言時に、内部フレームを持つキャンバス上のtkinterスクロールバーが無効になるのはなぜですか?
スクロールバーを再び機能させるにはどうすればよいですか?
import tkinter as tk
import tkinter.ttk as ttk
root = tk.Tk()
myframe = ttk.Frame(root)
myframe.pack()
sb = ttk.Scrollbar(myframe)
sb.pack(side=tk.RIGHT, fill=tk.Y, expand=1)
canvas = tk.Canvas(myframe, width=200, height=300,
scrollregion=(0, 0, 200, 300), yscrollcommand=sb.set)
canvas.pack()
frame = ttk.Frame(canvas, width=200, height=300) # inner Frame
canvas.create_window((0, 0), window=frame, anchor='nw')
sb.config(command=canvas.yview)
frame.bind("<Configure>", lambda event: canvas.configure(
scrollregion=canvas.bbox(tk.ALL)))
# frame.pack_propagate(0) # How to enable this and ensure scrollbar works?
s = tk.StringVar()
s.set("I'm a box")
for _ in range(100):
eb = ttk.Entry(frame, textvariable=s)
eb.pack()
root.mainloop()
EDIT1::エントリウィジェットが正しく列にサイズ設定されていないので、次の最小作業例はframe.pack_propagate(0)
、コメントアウトしているStringVar()
を追加しましたし、eb.pack()
にeb.grid()
を変更
あなたのクリスマスプレゼントをありがとう! – Zhulu