Tkinter:滚动条出现但不起作用

问题描述 投票:0回答:1

我已经在stackoverflow和其他地方(effbot等)上查看了许多引用。我已经能够在画布上显示框架,滚动条显示但无法滚动。 enter image description here

在这个例子中,我想要带有Entry小部件的框架滚动。我有另一个(真正的)应用程序,它有大量的条目小部件,导致框架超过其父级的高度。

#  **** SCROLL BAR TEST *****
from tkinter import *
from tkinter import ttk

root = Tk()
root.title("Scrollbar Test")
root.geometry("800x400")
root.configure(background="light gray")

frame = Frame(root, height=300, width = 200, borderwidth=2, relief=SUNKEN, background="light gray")
frame.grid(column=0, row=0, sticky=W)


yscrollbar = Scrollbar(frame)
yscrollbar.grid(column=1, row=2, sticky=N+S)


canvas = Canvas(frame, bd=0, scrollregion=(0,0,800, 600), yscrollcommand=yscrollbar.set)
canvas.grid(column=0, row=0, sticky=N+S+E+W)

yscrollbar.config(command=canvas.yview)

frame = Frame(canvas, height=300, width = 200, borderwidth=2, relief=SUNKEN, background="light gray")
frame.grid(column=0, row=0, sticky=W)

label = ttk.Label(frame, text="This is a label")
label.grid(column=1, row=0, sticky=W)

text = ttk.Entry(frame, textvariable="text")
text.grid(column=2, row=0, sticky=W)


label1= ttk.Label(frame, text="This is a label")
label1.grid(column=1, row=1, sticky=W)

text1 = ttk.Entry(frame, textvariable="text")
text1.grid(column=2, row=1, sticky=W)

label2 = ttk.Label(frame, text="This is a label")
label2.grid(column=1, row=2, sticky=W)

text2 = ttk.Entry(frame, textvariable="text")
text2.grid(column=2, row=2, sticky=W)

label3 = ttk.Label(frame, text="This is a label")
label3.grid(column=1, row=3, sticky=W)

text3 = ttk.Entry(frame, textvariable="text")
text3.grid(column=2, row=3, sticky=W)

label4 = ttk.Label(frame, text="This is a label")
label4.grid(column=1, row=4, sticky=W)

text4 = ttk.Entry(frame, textvariable="text")
text4.grid(column=2, row=4, sticky=W)

label5 = ttk.Label(frame, text="This is a label")
label5.grid(column=1, row=5, sticky=W)

text5 = ttk.Entry(frame, textvariable="text")
text5.grid(column=2, row=5, sticky=W)

label6 = ttk.Label(frame, text="This is a label")
label6.grid(column=1, row=6, sticky=W)

text6 = ttk.Entry(frame, textvariable="text")
text6.grid(column=2, row=6, sticky=W)

label7 = ttk.Label(frame, text="This is a label")
label7.grid(column=1, row=7, sticky=W)

text7 = ttk.Entry(frame, textvariable="text")
text7.grid(column=2, row=7, sticky=W)

label8 = ttk.Label(frame, text="This is a label")
label8.grid(column=1, row=8, sticky=W)

text8 = ttk.Entry(frame, textvariable="text")
text8.grid(column=2, row=8, sticky=W)

label9 = ttk.Label(frame, text="This is a label")
label9.grid(column=1, row=9, sticky=W)


text9 = ttk.Entry(frame, textvariable="text")
text9.grid(column=2, row=9, sticky=W)



root.mainloop()
python tkinter scrollbar
1个回答
0
投票

首先,滚动条应与画布放在同一行上。

其次,设置Frame的高度和宽度是没有意义的,因为它们被子属性的大小覆盖。

第三,使用create_window方法将项目添加到Canvas,而不是grid()

第四,您需要添加一个根据帧大小更新它的函数,而不是设置scrollregion。

全部一起:

#  **** SCROLL BAR TEST *****
from tkinter import *
from tkinter import ttk

def _on_frame_configure(self, event=None):
    canvas.configure(scrollregion=canvas.bbox("all"))

root = Tk()
root.title("Scrollbar Test")
root.geometry("800x400")
root.configure(background="light gray")

frame = Frame(root, borderwidth=2, relief=SUNKEN, background="light gray")
frame.grid(column=0, row=0, sticky=N+S+E+W)


yscrollbar = Scrollbar(frame)
yscrollbar.grid(column=1, row=0, sticky=N+S)

canvas = Canvas(frame, bd=0, yscrollcommand=yscrollbar.set)
canvas.grid(column=0, row=0, sticky=N+S+E+W)

yscrollbar.config(command=canvas.yview)

frame = Frame(canvas, borderwidth=2, relief=SUNKEN, background="light gray")
canvas.create_window(4, 4, window=frame, anchor='nw')
frame.bind("<Configure>", _on_frame_configure)

for i in range(30):
    label = ttk.Label(frame, text="This is a label "+str(i))
    label.grid(column=1, row=i, sticky=W)

    text = ttk.Entry(frame, textvariable="text")
    text.grid(column=2, row=i, sticky=W)

root.mainloop()

或者只使用某人已经制作的滚动框架,like this one that I made awhile ago

© www.soinside.com 2019 - 2024. All rights reserved.