2016-11-27 43 views
0

我在使用tkinter的python中創建json編輯器。滾動條無法在畫布上工作

我已經添加了一個滾動條,通過創建一個Canvas,並在其中放置一個Frame

然後我將Scrollbar命令設置爲canvas.yview。

這兩件事搞砸了,我不知道爲什麼。

  1. 當我按下滾動按鈕(向上和向下箭頭)畫布不滾動

  2. 我包裝滾動條到窗口(根)現在代替幀,因爲每當我將它包裝到框架上,tkinter應用程序無法打開,並且我的電腦風扇開始啓動...任何人都知道這裏發生了什麼? (因此,滾動條是微小的,如果你嘗試運行的代碼)

這裏是我的代碼:

編輯>代碼縮短

import Tkinter as tk 
import webbrowser 
import os 
import bjson as bj 

class App: 
    def __init__(self, master): 
     self.window = master 
     self.window.geometry("800x450") 
     self.canvas = tk.Canvas(self.window, width=800, height=400) 
     self.master = tk.Frame(self.canvas, width=800, height=400) 
     self.canvas.pack() 
     self.master.place(x=0, y=0) 
     scrollbar = tk.Scrollbar(self.window) 
     scrollbar.pack(side=tk.RIGHT, fill=tk.Y) 
     scrollbar.config(command=self.canvas.yview) 

    def init(self): 
     master = self.master 
     self.frames = { 
      "Home": HomeFrame(master) 
     } 
     self.openFrame = None 
     self.loadFrame("Home") 

    def loadFrame(self, frame): 
     self.openFrame = self.frames[frame] 
     self.openFrame.display() 

    def setTitle(self, t): 
     self.window.title(t) 

class Frame: 
    def __init__(self, master): 
     self.master = master 
     self.frame = tk.Frame(master) 
     self.frame.grid(row=0, column=0, sticky='news') 
     self.init() 
     self.frame_create() 

    def display(self): 
     self.frame.tkraise() #raises frame to top 
     self.frame_load()  #initializes the frame 

    def clear(self): 
     for widget in self.frame.winfo_children(): 
      widget.destroy() 

    def init(self): pass 
    def frame_load(self): pass 
    def frame_create(self): pass 

class HomeFrame(Frame): 
    def frame_create(self): 
     p = self.frame 
     for i in range(20): 
      tk.Label(p, text="This is content... " + str(i)).pack() 
      for j in range(2): 
       LineBreak(p) 

def LineBreak(p): 
    tk.Label(p, text="").pack() 

root = tk.Tk() 
glob = {} 
app = App(root) 
app.init() 
root.mainloop() 

這是一個有點長,有點混亂,但你應該看看我如何在App

__init__中添加滾動條任何人都有任何想法發生了什麼上,以及如何解決它?

在此先感謝!

+0

請刪除所有可能的代碼,同時仍然提供一個展示不良行爲的示例。請參閱[如何創建最小,完整和可驗證示例](http://www.stackoverflow.com/help/mcve) –

+0

我已將代碼更新爲縮短版本,但仍存在相同問題。謝謝你的幫助。 –

回答

0

代碼有很多錯誤。但是,滾動條無法正常工作的問題與您忽略的兩件事有關:

首先,滾動條和小部件需要雙向通信。畫布需要被告知滾動條,滾動條需要被告知畫布。你正在做的一個而不是其他:

self.canvas.configure(yscrollcommand=scrollbar.set) 
scrollbar.configure(command=self.canvas.yview) 

其次,你需要配置畫布的scrollregion屬性。這告訴tkinter您希望可以看到更大的虛擬畫布的哪一部分。通常,這是在畫布的<Configure>方法的綁定中完成的,通常您會希望將其設置爲畫布中所有內容的邊界框。對於後者,你可以將字符串"all"傳遞給bbox方法:

self.canvas.configure(scrollregion=self.canvas.bbox("all")) 

如果你知道你想成爲滾動區域的確切大小,你可以簡單地將它設置爲值(例如:scrollregion=(0,0,1000,1000)滾動在一個1000x1000像素的區域內)。

點#2的原因是,您不能同時使用packgrid共享同一父項的小部件。當你這樣做時,你會得到你描述的行爲。這是因爲grid將嘗試佈置所有的小部件。這可能會導致一些小部件更改大小。 pack會注意到一個或多個小部件大小的變化,並嘗試重新佈局所有小部件。這可能會導致一些小部件更改大小。grid會注意到一個或多個小部件大小的變化,並嘗試重新佈局所有小部件。等等。