2012-01-20 4 views
0

Я понимаю, что здесь задан вопрос, как и на других форумах. Я прочитал их все и каждый час работал над этими решениями, и я все еще не могу его получить. Целью было просто новое окно (Toplevel) с прокручиваемым холстом, в котором есть кадр с некоторым содержимым. Я все еще не могу получить прокрутки на холсте для работы:Полоса прокрутки на холсте в Tkinter

 #make new window 
     self.edit_window = Tkinter.Toplevel() 
     self.edit_window.title("Data Refinement") 
     self.edit_window.maxsize(height='50', width='300') 

     #make scrollbar for canvas 
     cScrollbar = Tkinter.Scrollbar(self.edit_window) 
     cScrollbar.pack(side=Tkconstants.RIGHT, fill=Tkconstants.Y) 

     #make canvas 
     canvas = Tkinter.Canvas(self.edit_window) 

     #attach canvas to scrollbar 
     canvas.config(yscrollcommand=cScrollbar.set) 
     cScrollbar.config(command=canvas.yview) 

     #make frame and put everything in frame 
     frame = Tkinter.Frame(self.edit_window) 

     #random fill 
     Tkinter.Label(frame, text="Enter bounds for the parameters").pack() 
     Tkinter.Label(frame, text="Enter bounds for the parameters").pack() 
     Tkinter.Label(frame, text="Enter bounds for the parameters").pack() 
     Tkinter.Label(frame, text="Enter bounds for the parameters").pack() 
     Tkinter.Label(frame, text="Enter bounds for the parameters").pack() 
     Tkinter.Label(frame, text="Enter bounds for the parameters").pack() 

     #scrollbar for listbox 
     scrollbar = Tkinter.Scrollbar(frame) 
     scrollbar.pack(side=Tkconstants.RIGHT, fill=Tkconstants.Y) 

     listbox = Tkinter.Listbox(frame) 
     listbox.pack() 

     #insert some random data for now into listbox 
     for i in range(100): 
      listbox.insert(Tkconstants.END, i) 

     # attach listbox to scrollbar 
     listbox.config(yscrollcommand=scrollbar.set) 
     scrollbar.config(command=listbox.yview) 

     #pack and attach to canvas 
     frame.pack(fill=Tkconstants.BOTH, expand=Tkconstants.YES) 
     canvas.create_window(0,0, anchor = Tkconstants.NW, window = frame) 

     canvas.pack(fill=Tkconstants.BOTH, expand=Tkconstants.YES) 
     canvas.config(scrollregion=canvas.bbox(Tkconstants.ALL)) 

Так кадр успешно сделано с содержимым. И рамка успешно прикреплена к холсту. То, что я не понимаю, - это то, что панель прокрутки, прикрепленная к списку, работает, пока тот, который подключен к холсту, отображается, но на самом деле не работает. Полоса прокрутки действует так, как будто все уже отображается. Это похоже на прокрутку на то, что видно, а не на прокрутку на весь контент холста.

+0

Кто-нибудь видит, почему то, как я это делаю, работает для списка, но не для холста? Я продолжаю применять примеры прокручивания холстов из Интернета, но я получаю ту же проблему ... это так ужасно расстраивает – user926914

ответ

1

Я сейчас не на компьютере, чтобы проверить, но я предполагаю следующее: высота кадра будет равна 1, пока виджет не будет отображен, и в этот момент он будет расти или сжиматься, чтобы соответствовать его содержимому. Тем не менее, вы устанавливаете область прокрутки холста до того, как это произойдет, поэтому область прокрутки эффективно равна нулю. Вы можете это подтвердить, распечатав результат команды canvas.bbox(Tkconstants.ALL)

Попробуйте добавить вызов self.update_idletasks, прежде чем настраивать область прокрутки и посмотреть, исправляет ли она это.

+0

Удивительный, вот и все, вызывая self.edit_window.update_idletasks() исправил его. – user926914

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