2

プログラムの一部にスクロールバーを作成しようとしています。親フレームには 3 つのラベル フレーム ウィジェットがあり、そのうちの 1 つは 50 ものオプション メニューを表示する必要があるため、スクロールバーが必要になります。

スクロールバーを使用してラベル フレームをスクロールできないことはわかっているので、このラベル フレーム内にスクロール可能なキャンバスを作成しました。次に、キャンバス内にフレームを挿入しました。これを使用して、オプション メニューを表示します。次に、スクロールバーをキャンバスにアタッチすると、スクロールバーがラベル フレーム内に配置されます。問題は、スクロールバーは機能しているように見えますが、どれだけスクロールしても、最初の 10 個のオプション メニューしか表示されないことです。以下に例を示します。

from Tkinter import *

app = Tk()
app.title("Example App")
app.geometry("550x400+300+300")

# Creating the first label frame
entryframe = LabelFrame(app,text="Entry",width=250,height=250)
entryframe.pack(side="top",fill=BOTH)

# Creating a frame to contain the options selected by the user; also using a canvas & 
# label frame to enable the use of a scrollbar
outcomesframe = LabelFrame(app,text="User Input",width=250,height=650)
outcomesframe.pack(side="left",fill=BOTH)
outcomescanvas = Canvas(outcomesframe,relief=SUNKEN)
outcomescanvas.config(width=230,height=650)
outcomescanvas.config(scrollregion=(0,0,300,1000))
outcomescanvas.config(highlightthickness=0)

# Creating scrollbar
scrollbar = Scrollbar(outcomesframe)
scrollbar.config(command=outcomescanvas.yview)
outcomescanvas.config(yscrollcommand=scrollbar.set)
scrollbar.pack(side="right",fill=Y)
outcomescanvas.pack(side="left",expand=YES,fill=BOTH)

# Creating the frame in which the option menus will be inserted
outcomesframe2 = Frame(outcomescanvas,width=230,height=1000)
outcomesframe2.pack(side="top",fill=BOTH)

# Creating the third label frame
statsframe = LabelFrame(app,text="Third Label Frame",width=250,height=250)
statsframe.pack(side="right",fill=BOTH)

# Creating the option menus
for i in range(50):
    vars()["labeltext"+str(i)] = StringVar()
    vars()["labeltext"+str(i)].set("Menu"+str(i+1)+":")
    vars()["label"+str(i)] = Label(outcomesframe2,textvariable=vars()["labeltext"+str(i)])
    vars()["label"+str(i)].grid(row=i,column=0)

    vars()["variable"+str(i)] = StringVar()
    vars()["variable"+str(i)].set("Select...")
    vars()["menu"+str(i)] = OptionMenu(outcomesframe2,vars()["variable"+str(i)],"Option1","Option2")
    vars()["menu"+str(i)].pack()

app.mainloop()
4

1 に答える 1

0

キャンバスをスクロールすると、キャンバス オブジェクトである項目のみがスクロールされます。つまり、またはcreate_windowを使用するのではなく、 を使用してウィンドウをキャンバスに配置する必要があります。packgrid

...
outcomescanvas.create_window(0,0,window=outcomesframe2, anchor="nw")
...
于 2012-06-28T21:34:10.177 に答える