Python tk Listbox: -listvariable class (on win XP)

Looney, James B james.b.looney at
Tue Jan 12 02:34:28 CET 2010

I mentioned that I figured out how to use a variable with a Python TK Listbox in my post (

Now, I'm trying to make a class, ListVar, that allows me to operate on a Listbox's listvariable as if it were a list.  The problem is, it doesn't work as expected some of the time.  If I try to add a sequence of simple strings, it doesn't display anything.  If I convert them to a tuple or instantiate a class (with __str__ defined), then it displays everything - the simple string, instances, tuples, everything.

I don't understand why it won't show the simple strings, by themselves, in the Listbox.  Notice - the spaces are important.  I can make this work without as much of a headache my strings don't have spaces (which is what the 2 or 3 examples I've been able to find did), but spaces apparently makes this more complicated.

Can anyone explain what's happening?  I'm completely frustrated with trying to figure this out.

Here is the simplest working code snippet I felt I could make:

import Tkinter, tkSimpleDialog

class ListVar( Tkinter.Variable, list ): # Dual inheritance
   def __init__( self, master = None, *args, **kw ):
      Tkinter.Variable.__init__( self, master )
      list.__init__( self, *args, **kw )
      self.set( self ) # populate the Tk variable

   def get( self ):
      value = Tkinter.Variable.get( self )
      if( isinstance( value, list ) ):
         return value
      return list( value )

   def set( self, value ):
      if( isinstance( value, list ) ):
         value = tuple( value )
      Tkinter.Variable.set( self, value )

   def append( self, item ): list.append( self, item ), self.set( self )

# Class to wrap around a string and make a simple instance.
class sillyString( object ):
   def __init__( self, s ): self.myString = s
   def __str__( self ): return self.myString

# Dialog class to display a Listbox and test the ListVar class.
class ListboxDialog( tkSimpleDialog.Dialog ):
   def __init__( self, master, listItems = [] ):
      self.myVar = ListVar( master, listItems ) # Initial set of the list
      tkSimpleDialog.Dialog.__init__( self, master, "Listbox testing" )

   def body( self, master ):
      Tkinter.Listbox( master, listvariable = self.myVar, width = 50 ).grid()
      self.myVar.append( "appended string" ) # test append

   def __str__( self ): return "%s" % self.myVar.get()

if( "__main__" == __name__ ):
   tk = Tkinter.Tk()
   # The spaces are important as my listbox will contain strings with spaces.
   # The print displays what's in the ListVar after the dialog exits
   print ListboxDialog( tk, '' ) # Simple String
   print ListboxDialog( tk, [ '' ] ) # list with empty string
   print ListboxDialog( tk, [ 'abc string' ] ) # list with short string
   print ListboxDialog( tk, [ sillyString( "instance 1" ) ] ) # class instance
   print ListboxDialog( tk, [ sillyString( "instance 1" ),
                              sillyString( "instance 2" ) ] ) # 2 instances
   print ListboxDialog( tk, [ ( "A tuple", ),
                              "A string" ] )            # tuple and string
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the Python-list mailing list