2017-07-01 20 views
1
  1. Tkinterキャンバスにスクロールバーを付けようとしています。
  2. スクロールバーをテストするために、私は100個の "Hello World"ラベルを動的に生成し、これらをコンテンツ保持フレーム内にパックしました。

私のコードは失敗します。問題:Tkinterキャンバスからスクロールバーが消え、サイドパッキングを拒否します

  1. スクロールバーが表示されません。
  2. 代わりにコンテンツフレームは、100パックのラベルの完全な高さに展開されます。
  3. 興味深いことに、私がself.frame_for_content.pack()self.scrollbar.pack()の下に移動すると、スクロールバーが魔法のように再現します。 (これがそうであるのはなぜ私を超えていますが、スクロールバーはまだどちらか仕事やside梱包行動に付着しない。)私は無駄に、scroll regionbboxにブライアンオークリーの提案のいくつかを組み込むことを試みてきた

私はコードを最小限に抑えましたが、プッシュすることはできません。助けを感謝します。

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() 

答えて

4

あなたがそのウィジェットのジオメトリマネージャのようなキャンバスを使用しているので、あなたはself.frame_for_content.pack()をしたくないので、self.canvas.create_window.packまたは.gridの代わりとなります。

サイズを正しく取得するには、キャンバスの境界ボックスから幅を&とすることができます。

私はこれが何をしたいんだと思う:

import tkinter as tk 

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, orient=tk.VERTICAL, command=self.canvas.yview) 

     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() 
     bbox = self.canvas.bbox(tk.ALL) 
     self.canvas.config(yscrollcommand=self.scrollbar.set, 
      width=bbox[2], height=bbox[3], scrollregion=bbox) 

TestGUI().mainloop() 
+0

ありがとうございました!これは意図したとおりに動作しますが、 'self.update()'の代わりに 'Scrollbar'を' self'に付ける必要があります。なぜ 'self.update()'が必要なのですか? – anonnoir

+1

@anonnoir心配はいりません。 ** 1 **スクロールバーをキャンバスに直接置くには、 'self.canvas.create_window'を使用してジオメトリを使ってその位置を正しく取得する必要があります。それを 'frame_for_content'に入れる方が簡単です。しかし、どちらの場合でも、スクロールバーが座っているキャンバスでスクロールバーが動かないという望ましくない動作をします。 ** 2 ** Tkinterにこれまでに指定したGUI要素のジオメトリ管理を完了させるために、 'self.update()'(あるいはもっと良い 'self.update_idletasks()')を呼び出す必要があります。もしそれをしなければ、 'bbox'は'(0、0、1、1) 'になります。 –

+0

説明をありがとう、ありがとう。 – anonnoir

関連する問題