2017-12-29 49 views
0

stackoverflow와 다른 곳 (effbot 등)에서 많은 참조를 보았습니다. 스크롤 막대를 표시하는 캔버스에서 프레임을 가져올 수 있지만 스크롤 할 수는 없습니다. enter image description hereTkinter : 스크롤바가 나타나지만 작동하지 않습니다.

이 예제에서는 엔트리 위젯이있는 프레임을 스크롤하려고합니다. 프레임이 상위의 높이를 초과하게하는 많은 항목 위젯이있는 또 다른 (실제) 응용 프로그램이 있습니다.

# **** 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() 
+0

캔버스에 추가 된 내용을'pack','place' 또는'grid'로 스크롤 할 수 없습니다. 예를 보려면 https://stackoverflow.com/a/3092341/7432를 읽어보십시오. –

답변

0

먼저 스크롤바는 캔버스와 같은 행에 배치해야합니다.

둘째, 프레임의 높이와 너비를 설정하는 것은 자식 속성의 크기로 덮어 쓰기 때문에 무의미합니다.

세 번째로 항목은 grid()이 아닌 create_window 메서드를 사용하여 Canvas에 추가됩니다.

스크롤 영역을 설정하는 대신 프레임 크기에 따라 업데이트하는 함수를 추가해야합니다. 모두 함께

:

# **** 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 만들어했다는 스크롤 프레임을 사용합니다.