Почему не запускается полоса прокрутки, когда 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()
Я не понимаю ваш комментарий о рисовании объектов поверх виджетов. Вы используете это как оправдание отказа от использования фрейма, но виджеты, которые вы рисуете, также являются виджетами, поэтому вы по-прежнему не можете рисовать объекты поверх них. –