1
- Tkinterキャンバスにスクロールバーを付けようとしています。
- スクロールバーをテストするために、私は100個の "Hello World"ラベルを動的に生成し、これらをコンテンツ保持フレーム内にパックしました。
私のコードは失敗します。問題:Tkinterキャンバスからスクロールバーが消え、サイドパッキングを拒否します
- スクロールバーが表示されません。
- 代わりにコンテンツフレームは、100パックのラベルの完全な高さに展開されます。
- 興味深いことに、私が
self.frame_for_content.pack()
をself.scrollbar.pack()
の下に移動すると、スクロールバーが魔法のように再現します。 (これがそうであるのはなぜ私を超えていますが、スクロールバーはまだどちらか仕事やside
梱包行動に付着しない。)私は無駄に、scroll region
とbbox
にブライアンオークリーの提案のいくつかを組み込むことを試みてきた
。
私はコードを最小限に抑えましたが、プッシュすることはできません。助けを感謝します。
import tkinter as tk
import tkinter.ttk as ttk
class TestGUI(tk.Tk):
def __init__(self):
super().__init__()
self.canvas = tk.Canvas(self)
self.frame_for_content = tk.Frame(self.canvas)
self.canvas_frame = self.canvas.create_window((0,0), window=self.frame_for_content, anchor=tk.NW)
self.scrollbar = tk.Scrollbar(self.canvas, orient=tk.VERTICAL, command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.scrollbar.set)
self.frame_for_content.pack()
self.canvas.pack(side=tk.LEFT)
self.scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
for i in range(100):
tk.Label(self.frame_for_content, text="Hello World - " + str(i)).pack()
self.update()
self.canvas.config(scrollregion=self.canvas.bbox(tk.ALL))
TestGUI().mainloop()
ありがとうございました!これは意図したとおりに動作しますが、 'self.update()'の代わりに 'Scrollbar'を' self'に付ける必要があります。なぜ 'self.update()'が必要なのですか? – anonnoir
@anonnoir心配はいりません。 ** 1 **スクロールバーをキャンバスに直接置くには、 'self.canvas.create_window'を使用してジオメトリを使ってその位置を正しく取得する必要があります。それを 'frame_for_content'に入れる方が簡単です。しかし、どちらの場合でも、スクロールバーが座っているキャンバスでスクロールバーが動かないという望ましくない動作をします。 ** 2 ** Tkinterにこれまでに指定したGUI要素のジオメトリ管理を完了させるために、 'self.update()'(あるいはもっと良い 'self.update_idletasks()')を呼び出す必要があります。もしそれをしなければ、 'bbox'は'(0、0、1、1) 'になります。 –
説明をありがとう、ありがとう。 – anonnoir