2016-03-27 2 views
2

Я хочу разместить, например, 20 текстовых полей на холсте. Поэтому моя иерархия виджета - это главное окно -> холст -> текстовые поля. Текстовые поля не могут быть помещены в холст, поэтому я хочу привязать к нему вертикальную полосу прокрутки. Вот то, что я пробовал:Невозможно сделать вертикальную работу прокрутки на холсте

from tkinter import * 
root = Tk() 
root_height = root.winfo_screenheight() 
root_width = root.winfo_screenwidth() 
root.geometry("%dx%d+0+0" % (root_width, root_height)) 

canvas = Canvas(root, height=root_height, width=root_width) 
canvas.pack(fill=BOTH, expand=1) 

scrollbar = Scrollbar(canvas) 
scrollbar.pack(side=RIGHT, fill=Y) 
canvas.config(yscrollcommand=scrollbar.set) 

textBoxes = [] 

for i in range(0, 20): 
    textBoxes.append(Text(canvas, height=1, width=20, bd=2)) 

y_offset = 15 
for i in range(0, 20): 
    textBoxes[i].place(x=10, y=y_offset) 
    y_offset += 60 

scrollbar.config(command=canvas.yview) 


mainloop() 

Так в принципе, я пытался сделать то, что я понял из учебников и других вопросов -

  1. Установка виджета (холст) yscrollcommand обратные вызовы к set метод полосы прокрутки.

  2. Установить команду прокрутки в метод yview виджета (холст).

К сожалению, полоса прокрутки выглядит неприступной. Где я ошибаюсь и как я могу достичь желаемого поведения?

ответ

1

Полосы прокрутки только прокручивают объекты холста. Он не будет прокручивать виджеты, добавленные внутри холста, с pack, place или grid. Для прокрутки виджета необходимо добавить canvas.create_window(...).

+1

не могли бы вы помочь мне больше с измененным примером моего кода? – CuriousGuy

2

Вы можете использовать отдельный виджет Frame, содержащий все объекты Text. Затем в Canvas вызовите метод .create_windowFrame как аргумент window.

from tkinter import * 

root = Tk() 
root_width = root.winfo_screenwidth() 
root_height = root.winfo_screenheight() 

canvas = Canvas(root) 
canvas.pack(side=LEFT, fill=BOTH, expand=True) 

scrollbar = Scrollbar(root, orient=VERTICAL) 
scrollbar.pack(side=RIGHT, fill=Y) 

frame = Frame(canvas) 
frame.pack(fill=BOTH, expand=True) 

def resize(event): 
    canvas.configure(scrollregion=canvas.bbox(ALL)) 

canvas.create_window((0, 0), window=frame, anchor=NW) 

canvas.config(yscrollcommand=scrollbar.set) 
scrollbar.config(command=canvas.yview) 
frame.bind('<Configure>', resize) 

for i in range(20): 
    text = Text(frame, width=30, height=1) 
    text.grid(row=i, pady=i*10) 

mainloop() 
Смежные вопросы