2016-10-17 108 views
0

爲什麼當create_window框架對象開始超出底部self.container窗口時不會啓動滾動條?Python Tkinter Canvas許多create_window()項目不滾動滾動條

我的理解是,如果窗口小部件使用create_window嵌入畫布中,它們就是可滾動的。對於上下文,我不想創建滾動框架 - 將所有小部件放在一個框架中,使用create_window將該框架添加到畫布上 - 因爲我打算將這些框架對象移到畫布上並利用大量畫布能力。根據Effbot,您不能在小部件頂部繪製其他畫布項目。,所以如果我有一個滾動框架,我不能把小部件放在上面。

那麼如何滾動包含許多create_window對象的畫布,或者我在下面做錯了什麼?

import tkinter as tk 

class Canvas_Scrollbar_CreateWindow(tk.Frame): 

    def __init__(self, parent): 
    tk.Frame.__init__(self, parent) 
    self.parent = parent 
    self.parent.columnconfigure(0, weight=1) 
    self.grid_columnconfigure(0, weight=1) 

    self.block_count = 0 

    self.button = tk.Button(self, text='Add', command=self.addblock) 
    self.button.grid(row=0, column=0, columnspan=2, sticky='new') 

    self.container = tk.Frame(self) 
    self.container.grid(row=1, column=0, sticky='nsew') 

    self.canvas = tk.Canvas(self.container, width=200, height=450) 
    self.scrollbar = tk.Scrollbar(self.container, 
            orient='vertical',command=self.canvas.yview) 
    self.canvas.config(yscrollcommand=self.scrollbar.set) 
    self.canvas.grid(row=0, column=0, sticky='nsew') 
    self.scrollbar.grid(row=0, column=1, sticky='nse') 

    self.container.bind('<Configure>', self.handle_scroll) 

    def addblock(self): 
    self.block = tk.Frame(self.canvas, bd=1, relief='solid') 
    self.block.columnconfigure(0, weight=1) 
    self.canvas.create_window((0, (self.block_count*25)), 
           window=self.block, anchor="nw", 
           width=200, height=24) 
    self.block_count += 1 

    def handle_scroll(self, event): 
    self.canvas.configure(scrollregion=self.canvas.bbox("all")) 

root = tk.Tk() 
app = Canvas_Scrollbar_CreateWindow(root) 
app.grid(row=0, column=0, sticky='ew') 
root.mainloop() 

tkinter create_window scrollbar

+0

我不明白你關於在小部件上面繪製對象的評論。你使用它作爲不使用框架的理由,但是你繪製的小部件也是小部件,所以你仍然不能在它們之上繪製對象。 –

回答

1

添加內容時到畫布上,必須重新配置scrollregion