2017-12-29 92 views
0

私はstackoverflowと他の場所(effbotなど)の両方で多数の参照を見てきました。スクロールバーが表示されているキャンバスにフレームを表示できましたが、スクロールすることはできません。 enter image description hereTkinter:スクロールバーが表示されるが動作しない

この例では、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() 
+0

キャンバスに追加されたものを 'pack'、' place'、または 'grid'でスクロールすることはできません。例についてはhttps://stackoverflow.com/a/3092341/7432をお読みください –

答えて

0

まず、スクロールバーはキャンバスと同じ行に配置する必要があります。

第2に、Frameの高さと幅の設定は、子属性のサイズによって上書きされるため、無意味です。

第3に、アイテムはメソッドでキャンバスに追加され、grid()ではありません。

スクロール領域を設定する代わりに、フレームサイズに基づいてスクロール領域を更新する関数を追加する必要があります。すべて一緒に

# **** 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を使用しています。

関連する問題