2012-06-28 5 views
2

Я пытаюсь создать полосу прокрутки в рамках моей программы. Родительский фрейм имеет три виджета фрейма, один из которых должен отображать до 50 дополнительных меню, что делает желательным полосу прокрутки.Tkinter; Использование полосы прокрутки в холсте

Я знаю, что вы не можете использовать полосу прокрутки для прокрутки рамки метки, поэтому внутри этого фрейма метки я создал холст, который можно прокручивать. Затем я вставил кадр внутри холста, который я буду использовать для отображения меню параметров. Затем я прикрепляю полосу прокрутки к холсту, а полосу прокрутки помещают внутри рамки метки. Проблема в том, что полоса прокрутки выглядит функциональной, но видимы только первые 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() 
+0

У вас есть ошибка в коде. Вы используете как сетку, так и пакет в одном и том же контейнере ('итогиframe2') –

+0

Спасибо. Исправлено это сейчас. –

ответ

0

При прокрутке холста он прокручивает только элементы, которые являются объектами холста. Это означает, что вы должны использовать create_window, чтобы поместить окно в холст, вместо использования pack или grid.

... 
outcomescanvas.create_window(0,0,window=outcomesframe2, anchor="nw") 
... 
+0

Спасибо! Искренне благодарю! –

Смежные вопросы