2016-09-06 10 views
0

キャンバスに配置されたいくつかのウィジェットを使用して、いくつかのタスクを通じて進捗状況を表示しています。これを行うために、フレームのキャンバスにグリッドを配置します。ほとんどすべてが動作しますが、ウィンドウの下部(フレーム)にデフォルト設定するにはスクロールバーが必要です。 vsb.setを使用してスクロールバーを新しい位置に強制しようとしましたが、効果はありません。イベントハンドラを使用してスクロールバーを移動すると、私はその動きを制御できなくなります。私は初心者ですし、いくつかの入力を感謝します。以下のコードを参照してください。キャンバスに複数のウィジェットを自動スクロールする

from tkinter import * 
import tkinter as tk 

class example(Frame): 
    def __init__(self, root): 
     Frame.__init__(self, root) 
     self.initUI() 

    def initUI(self): 
     self.canvas = Canvas(root, borderwidth=0, background="#ffffff", height=300, width=700) 
     self.frame = Frame(self.canvas, background="#ffffff") 
     self.vsb = Scrollbar(root, orient="vertical", command=self.canvas.yview) 
     self.canvas.configure(yscrollcommand=self.vsb.set) 
     self.vsb.pack(side="right", fill="y") 
     self.canvas.pack(side="left", fill="both", expand=True) 
     self.canvas.create_window((4,4), window=self.frame, anchor="nw", tags="self.frame") 
     self.frame.bind("<Configure>", self.onFrameConfigure) 
     root.title("Issue with Scrolling through Widgets") 
     self.populate()  

    def onFrameConfigure(self, event): 
     ###Reset the scroll region to encompass the inner frame 
     self.canvas.configure(scrollregion=self.canvas.bbox("all")) 
     self.canvas.bind_all("<MouseWheel>", self._on_mousewheel) 

    def _on_mousewheel(self, event): 
     self.canvas.yview_scroll(-1*int(event.delta/120),"units") 

    def populate(self): 
     ###Put in some fake data### 
     for row in range(20):       
      Txt = Text(self.frame, bg="white", borderwidth=1, height=1, width=40) 
      Txt.grid(row = row, column = 0, rowspan = 1, columnspan = 1, sticky = W+E+N+S) 
      line = "this is the first column for row %s" %row 
      Txt.insert(END, str(line)) 
      Txt = Text(self.frame, bg="white", borderwidth=1, height=1, width=40) 
      Txt.grid(row = row, column = 1, rowspan = 1, columnspan = 1, sticky = W+E+N+S) 
      line = "this is the second column for row %s" %row 
      Txt.insert(END, str(line)) 

if __name__ == "__main__": 
    root=Tk() 
    example(root).pack(side="top", fill="both", expand=True) 
    root.mainloop() 
+0

「ウィンドウの下部にデフォルトで」、内容を下にスクロールしたい、または実際のスクロールバーを別の物理的な位置にしたいということですか? –

+0

私は、ウィンドウに最後に送信されたものを表示することをデフォルトにしたいと思います。 –

答えて

0

はい、新しいデータがグリッドに置かれると、スクロールバーを下に移動したいと思います。私は動作する解決策を見つけましたが、それが適切であるかどうかはわかりません。私はonFrameConfigure関数を次のように変更しました。

def onFrameConfigure(self, event): # Reset the scroll region to encompass the inner frame 
    global insertFlag 
    self.canvas.configure(scrollregion=self.canvas.bbox("all")) 
    self.canvas.bind_all("<MouseWheel>", self._on_mousewheel) 
    if insertFlag == 1: 
     self.canvas.yview_scroll(20, "units") 
     insertFlag = 0 

次に、グローバル変数を設定するためにif文を入力します。

def populate(self): 
    global insertFlag 
    for row in range(20): 
     Txt = Text(self.frame, bg="white", borderwidth=1, height=1, width=40) 
     Txt.grid(row = row, column = 0, rowspan = 1, columnspan = 1, sticky = W+E+N+S) 
     line = "this is the second column for row %s" %row 
     Txt.insert(END, str(line)) 
     Txt.see(END) 
    insertFlag = 1 

あなたの意見はどうですか?

関連する問題