2016-10-17 74 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