2015-11-06 175 views
0

我有一個已完成或繼續模擬的列表,用戶可以通過一個檢查按鈕選擇並相互比較。該列表最近增長超出屏幕的大小,所以我想實現一個滾動條。我將窗口實現爲Toplevel,並在StackOverflow上的一個示例中將一個框架放置在Toplevel中,其中包含一個包含基於網格的複選框和標籤數組的框架。滾動條顯示在右側,但不能滾動。這裏是我的代碼:Python Tkinter可滾動框架有一個滾動條,但不滾動

def overview_callback(self): 
    self.overviewWindow = Toplevel(self.master) 
    self.overviewWindow.geometry("1500x500") 
    self.overviewFrame = Frame(self.overviewWindow) 
    self.overviewFrame.pack(side=TOP, fill="both", expand=True) 
    self.overviewCanvas = Canvas(self.overviewFrame) 
    self.insideFrame = Frame(self.overviewCanvas) 
    self.hsb = Scrollbar(self.overviewFrame, orient="horizontal", command=self.overviewCanvas.xview) 
    self.hsb.pack(side=BOTTOM, fill="x") 
    self.overviewCanvas.configure(xscrollcommand=self.hsb.set) 

    self.vsb = Scrollbar(self.overviewFrame, orient="vertical", command=self.overviewCanvas.yview) 
    self.overviewCanvas.configure(yscrollcommand=self.vsb.set) 
    self.vsb.pack(side=RIGHT, fill="y") 
    self.overviewCanvas.pack(side=TOP, fill="both", expand=True) 
    self.overviewCanvas.create_window((0,0), window=self.insideFrame, anchor="nw", tags="self.insideFrame") 
    self.overviewCanvas.pack(side=TOP, fill="both", expand=True) 
    self.insideFrame.bind("<Configure>", self.onFrameConfigure) 

    self.overviewWindow.title("Simulations Overview") 
    self.overviewList = [] 
    self.overviewVariables = [] 
    count = 0 
    for geometry in self.gNames: 
     goalNames = os.listdir('Geometries/'+geometry+'/Goals') 
     if len(goalNames) > 0: 
      for l, goal in enumerate(goalNames): 
       count += 1 
       self.overviewList.append([geometry, goal]) 
       self.overviewVariables.append(IntVar()) 
       Checkbutton(self.insideFrame, variable=self.overviewVariables[-1]).grid(row=count, column=0, sticky=W) 
       Label(self.insideFrame, text=geometry+","+goal+":").grid(row=count, column=1, sticky=W) 
       simStatus, simType, latestResult = tuneUtils.getLatestResult(goal, 'Geometries/'+geometry+'/Goals/'+goal+"/Output.txt") 
       if simStatus == "Not Started": 
        Label(self.insideFrame, text=simStatus).grid(row=count, column=2, sticky=W) 
       else: 
        # Extract Within/Not Within and GlobalMetric number to display 
        upToNotWithin = re.findall("^.*"+"not within Tolerance: ["+"[\w\s]*\]",latestResult)[0] 
        score = re.findall("GlobalMetric = "+"[\s\-\d\.]*", latestResult)[0] 
        Label(self.insideFrame, text=simStatus+" "+simType+" "+upToNotWithin+" "+score).grid(row=count, column=2, sticky=W) 
    button_frame = Frame(self.overviewWindow) 
    button_frame.pack(side=BOTTOM) 
    exit_button = Button(button_frame, text='Exit', command=self.overviewExit_callback) 
    compare_button = Button(button_frame, text='Compare', command=self.overviewCompare_callback) 
    for b in (exit_button, compare_button): 
     b.pack(side=LEFT, expand=YES, padx=10, pady=10, fill=BOTH) 

def onFrameConfigure(self, event): 
    self.overviewCanvas.configure(scrollregion=self.overviewCanvas.bbox("all")) 

謝謝你的幫忙。

爲了使窗口可調整大小,並將滾動條放在正確的位置,我做了大量編輯。謝謝您的幫助。

回答

1

如果您希望小部件滾動,則不能使用grid將小部件放置在畫布內。您必須使用畫布的create_window方法。嘗試刪除這條語句:

self.insideFrame.grid() 
+0

謝謝布萊恩,刪除違規行後,有一個滾動條,但我看不到每個句子的整個寬度。我如何指定窗口的寬度/高度? –

+0

@TroyRockwood:您可以使用'create_window'命令在創建時指定寬度。之後,您可以使用畫布的'item_configure'方法將幀的寬度設置爲與畫布的「'方法相關聯的函數中的畫布寬度。 –