title: Dynamically changing scrollregion of a canvas in Tkinter
body: <p>So I've got a custom widget that inherits from frame and contains a canvas and a scrollbar, and a custom widget that also inherits from frame that I want to dynamically add to the canvas, resizing the scrollregion as necessary. Here's my code:</p>
  
  <pre><code>class MessageItem(Frame):
  """A message to be contained inside a scrollableContainer"""
  
  def __init__(self, message, **kwds):
      Frame.__init__(self, **kwds)
      self.text = Label(self, text = message)
      self.text.grid(column = 0, row = 0, sticky = N+S+E+W)
  
  class scrollableContainer(Frame):
  """A scrollable container that can contain a number of messages"""
  
  def initContents(self):
      """Initializes a scrollbar, and a canvas that will contain all the items"""
  
      #the canvas that will contain all our items
      self.canv = Canvas(self)
      self.canv.grid(column = 0, row = 0, sticky = N+S+W)
      #force Tkinter to draw the canvas
      self.canv.update_idletasks()
      #use the values from the canvas being drawn to determine the size of the scroll region
      #note that currently, since the canvas contains nothing, the scroll region will be the same as 
      #the size of the canvas
      geometry = self.canv.winfo_geometry()
      xsize, ysize, xpos, ypos = parse_geometry_string(geometry) 
      self.canv['scrollregion'] = (0, 0, xsize, ysize) 
  
      #the scrollbar for that canvas
      self.vscroll = Scrollbar(self, orient = VERTICAL, command = self.canv.yview )
      self.vscroll.grid(column = 1, row = 0, sticky = N+S+E)
  
      self.canv["yscrollcommand"] = self.vscroll.set
  
  def __init__(self, **kwds):
      Frame.__init__(self, **kwds)
  
      #initialize the widget's contents
      self.grid(sticky = N+S+E+W)
      self.pack()
      self.initContents()
  
      #initialize the list of contents so we can append to it
      self.contents = []
  
  def addMessage(self, message):
      #Add the message to the list of contents
      self.contents.append(MessageItem(message))
      #Add the message to the grid
      self.contents[(len(self.contents) - 1)].grid(column = 0, row = (len(self.contents) - 1))
      #set the new scrollable region for the canvas
      scrollregionlist = self.canv['scrollregion'].split()
      oldRegion = int(scrollregionlist[3])
      newRegion = oldRegion + parse_geometry_string(self.contents[
          (len(self.contents) - 1)].winfo_geometry())[3]
      self.canv['scrollregion'] = (int(scrollregionlist[0]), int(scrollregionlist[1]),
          int(scrollregionlist[2]), newRegion)
  </code></pre>
  
  <p>The problem I'm experiencing is that self.canv['scrollregion'] appears to disappear outside of <strong>init</strong>. In the addMessage method, in the line:</p>
  
  <pre><code> scrollregionlist = self.canv['scrollregion'].split()
  </code></pre>
  
  <p>The scrollregion property on self.canv returns an empty string, which I can verify by putting a</p>
  
  <pre><code> print self.canv['scrollregion']
  </code></pre>
  
  <p>immediately before that line</p>