无法在画布上进行垂直滚动

时间:2016-03-27 17:56:57

标签: python tkinter tcl tk

我想在Canvas中放置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方法。

  3. 不幸的是,滚动条显示为不可点击。哪里我错了,我怎样才能达到理想的行为?

2 个答案:

答案 0 :(得分:2)

您可以使用包含所有Frame个对象的单独Text窗口小部件。然后在Canvas中调用.create_window方法设置Frame作为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()

答案 1 :(得分:1)

滚动条仅滚动画布对象。它不会使用packplacegrid滚动添加到画布中的小部件。要使窗口小部件可滚动,必须添加canvas.create_window(...)