1. ホーム
  2. python

[解決済み] フレーム用Tkinterスクロールバー

2023-06-26 06:32:11

質問

私の目的は、いくつかのラベルを含むフレームに垂直スクロールバーを追加することです。フレーム内のラベルがフレームの高さを超えると同時に、スクロールバーが自動的に有効になるようにする必要があります。検索した後、私は見つけた この という有用な投稿を見つけました。その投稿に基づき、私が望むことを達成するために、(私が初心者であるため、間違っていたら訂正してください)私が作成しなければならないことを理解しました。 Frame を最初に作成し、次に Canvas を作成し、スクロールバーもそのフレームに貼り付けます。その後、別のフレームを作成し、ウィンドウ・オブジェクトとしてキャンバスの中に配置します。で、最終的にこうなる。

from Tkinter import *

def data():
    for i in range(50):
       Label(frame,text=i).grid(row=i,column=0)
       Label(frame,text="my text"+str(i)).grid(row=i,column=1)
       Label(frame,text="..........").grid(row=i,column=2)

def myfunction(event):
    canvas.configure(scrollregion=canvas.bbox("all"),width=200,height=200)

root=Tk()
sizex = 800
sizey = 600
posx  = 100
posy  = 100
root.wm_geometry("%dx%d+%d+%d" % (sizex, sizey, posx, posy))

myframe=Frame(root,relief=GROOVE,width=50,height=100,bd=1)
myframe.place(x=10,y=10)

canvas=Canvas(myframe)
frame=Frame(canvas)
myscrollbar=Scrollbar(myframe,orient="vertical",command=canvas.yview)
canvas.configure(yscrollcommand=myscrollbar.set)

myscrollbar.pack(side="right",fill="y")
canvas.pack(side="left")
canvas.create_window((0,0),window=frame,anchor='nw')
frame.bind("<Configure>",myfunction)
data()
root.mainloop()

  1. 私は正しいことをしているのでしょうか?このコードが私に与えた出力を達成するために、より良い/よりスマートな方法があるのでしょうか?
  2. なぜ grid メソッドを使用しなければならないのですか?(私はplaceメソッドを試しましたが、どのラベルもキャンバスに表示されません)。
  3. 何が特別なのでしょうか? anchor='nw' を使うのは特別なことですか?

初心者のため、簡単な回答でお願いします。

どのように解決するのですか?

<ブロッククオート

このコードで得られる出力を達成するために、より良い/よりスマートな方法はありますか?

一般的に言えば、はい、あなたは正しいことをしています。Tkinterにはcanvas以外にネイティブのスクロール可能なコンテナがありません。ご覧のとおり、セットアップはそれほど難しくありません。あなたの例が示すように、行の数え方にもよりますが、5、6行のコードで動作します。

"なぜグリッドメソッドを使わなければならないのでしょうか(placeメソッドを試しましたが、どのラベルもキャンバス上に表示されませんでした?)"。

なぜグリッドを使わなければならないのか、というご質問ですね。グリッドを使用する必要はありません。Place、grid、packはすべて使用できます。単に、特定の種類の問題により自然に適しているものがあるというだけです。この場合、実際のグリッド(ラベルの行と列)を作成しているように見えますので、gridが自然な選択です。

"キャンバスにウィンドウを作成するときに anchor='nw' を使用することの何がそんなに特別なのでしょうか?"。

アンカーは、指定された座標にウィンドウのどの部分が配置されるかを示します。デフォルトでは、ウィンドウの中心がその座標に配置されます。上記のコードの場合、左上 ("northwest") の角が座標になるようにしたいのです。