2016-03-27 33 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

スクロールバーのみスクロールキャンバスオブジェクトです。キャンバス内に追加されたウィジェットをpackplace、またはgridとスクロールしません。ウィジェットをスクロール可能にするには、canvas.create_window(...)を追加する必要があります。

+1

私のコードの変更例を教えてください。 – CuriousGuy

2

Textのすべてのオブジェクトを含む個別のFrameウィジェットを使用できます。次にCanvas.create_windowメソッド設定Framewindow引数として呼び出します。

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() 
関連する問題