I mentioned that I figured out how to use a variable with a Python TK Listbox 
in my post (http://www.mail-archive.com/python-list@python.org/msg271288.html).

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.
Thanks,
-JB

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

[code]
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()
   tk.withdraw()
   # 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
[/code]
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to