2016-10-17 6 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 при добавлении элементов на холсте.