2014-01-28 4 views
1

Я написал немного кода, и я не могу, поскольку жизнь меня выясняет, почему это не работает. Я пытаюсь создать кадр с полосой прокрутки с динамическим содержимым, но по какой-то причине полоса прокрутки не будет прокручиваться.Tkinter dynamic «iframe» не будет прокручиваться

import scrolledframe 
from Tkinter import * 

class app(Tk): 
    def __init__(self, parent): 
     Tk.__init__(self, parent) 
     self.parent=parent 
     self.initialize() 
     populateinterior(self.sframe.interior) 
    def initialize(self): 
     self.grid() 
     self.grid_columnconfigure(0, weight=1) 
     self.grid_rowconfigure(0,weight=1) 
     self.resizable(True,True) 
     self.sframe = scrolledframe.VerticalScrolledFrame(self) 
     self.sframe.grid() 

def OnButtonClick(): 
     appinstance.sframe.interior.buttons.append(Button(appinstance.sframe.interior, text=u'Click meh!',command=OnButtonClick)) 
     appinstance.sframe.interior.buttons[-1].grid(row=len(appinstance.sframe.interior.buttons)+1,column=0) 
def populateinterior(self): 
     self.grid() 
     self.buttons=[] 

     self.buttons.append(Button(self, text=u'Click meh!',command=OnButtonClick)) 
     self.buttons[-1].grid(row=len(self.buttons)+1,column=0) 

if __name__=="__main__": 
    appinstance=app(None) 
    appinstance.title("All dem appz belong to meh") 
    appinstance.mainloop() 

scrolledframe не то, что я написал сам, но здесь это в любом случае:

from Tkinter import * 
class VerticalScrolledFrame(Frame): 
    """A pure Tkinter scrollable frame that actually works! 

    * Use the 'interior' attribute to place widgets inside the scrollable frame 
    * Construct and pack/place/grid normally 
    * This frame only allows vertical scrolling 

    Assuming this is Public domain, but it's from here: http://tkinter.unpythonic.net/wiki/VerticalScrolledFrame 

    """ 
    def __init__(self, parent, *args, **kw): 
     Frame.__init__(self, parent, *args, **kw)    

     # create a canvas object and a vertical scrollbar for scrolling it 
     vscrollbar = Scrollbar(self, orient=VERTICAL) 
     vscrollbar.pack(fill=Y, side=RIGHT, expand=FALSE) 
     canvas = Canvas(self, bd=0, highlightthickness=0, 
         yscrollcommand=vscrollbar.set) 
     canvas.pack(side=LEFT, fill=BOTH, expand=TRUE) 
     vscrollbar.config(command=canvas.yview) 

     # reset the view 
     canvas.xview_moveto(0) 
     canvas.yview_moveto(0) 

     # create a frame inside the canvas which will be scrolled with it 
     self.interior = interior = Frame(canvas) 
     interior_id = canvas.create_window(0, 0, window=interior, 
              anchor=NW) 

     # track changes to the canvas and frame width and sync them, 
     # also updating the scrollbar 
     def _configure_interior(event): 
      # update the scrollbars to match the size of the inner frame 
      size = (interior.winfo_reqwidth(), interior.winfo_reqheight()) 
      canvas.config(scrollregion="0 0 %s %s" % size) 
      if interior.winfo_reqwidth() != canvas.winfo_width(): 
       # update the canvas's width to fit the inner frame 
       canvas.config(width=interior.winfo_reqwidth()) 
     interior.bind('<Configure>', _configure_interior) 

     def _configure_canvas(event): 
      if interior.winfo_reqwidth() != canvas.winfo_width(): 
       # update the inner frame's width to fill the canvas 
       canvas.itemconfigure(interior_id, width=canvas.winfo_width()) 
     canvas.bind('<Configure>', _configure_canvas) 

     return 

Любые подсказки? (я знаю, что это некрасиво код, но это лишь доказательство концепции)

+0

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

ответ

2

Проблема в первой линии в populateinterior:

def populateinterior(self): 
    self.grid() 
    ... 

self в этом контексте является интерьер виджет прокрученного кадра. Вы вызываете на него grid, чего вы не должны делать. Внутренняя рама не должна быть упакована, размещена или решена внутри полотна. Вместо этого он должен быть объектом canvas, который создается с помощью метода canvas create_window (который обрабатывается классом VerticalScrolledFrame). Когда вы вызываете grid на внутреннюю рамку, вы нарушаете связь между холстом и рамкой.

+0

Хорошо посмотри на это. Благодаря :) – Synthetica

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