Using StringVars in List of Dictionaries as tkInter variables for Scale and Label widgets

Peter Otten __peter__ at web.de
Mon May 19 14:11:20 EDT 2008


seanacais wrote:

> I'm trying to build an unknown number of repeating gui elements
> dynamically so I need to store the variables in a list of
> dictionaries.  I understand that  Scale "variable" name needs to  be a
> StringVar  but I cannot figure out how to initialize the dictionary.
> 
> I've tried the following code
> 
> ps = PowerSupply()            # Instantiate a Power Supply VM Object
> numOPs = ps.getOnum()      # Find the number of outputs
> OPValues = []                 # Global list to hold one dictionary per output
> 
> for c in range(numOPs):
> OPValues.append({ })
> ps.initOPValues(c, OPValues[c])
> 
> 
> 
> ps.initOPValues is defined as follows:
> 
> def initOPValues(self, OPname, dname):
> 
> OPDefaults = {
> 'Vval'  : 0,
> 'Ival'  : 0,
> 'Otemp' : 0
> }
> 
> dname = dict((d,StringVar()) for d in OPDefaults)
> for d in OPDefaults:
> dname[d].set(OPDefaults[d])
> 
> I get the following error:
> 
> Traceback (most recent call last):
>   File "C:\Code\gui\tkinter.py", line 165, in <module>
>     ps.initOPValues(c, OPValues[c])
>   File "C:\Code\gui\tkinter.py", line 47, i initOPValues
>     dname = dict((d,StringVar()) for d in OPDefaults)
>   File "C:\Code\gui\tkinter.py", line 47, in <genexpr>
>     dname = dict((d,StringVar()) for d in OPDefaults)
>   File "C:\Python25\lib\lib-tk\Tkinter.py", line 254, in __init__
>     Variable.__init__(self, master, value, name)
>   File "C:\Python25\lib\lib-tk\Tkinter.py", line 185, in __init__
>     self._tk = master.tk
> AttributeError: 'NoneType' object has no attribute 'tk'
> Exception exceptions.AttributeError: "StringVar instance has no
> attribute '_tk'"
>  in <bound method StringVar.__del__ of <Tkinter.StringVar instance at
> 0x00B7D468>> ignored
> 
> Any help is appreciated!

There's some magic going on behind the scene which means that you have to
create a Tkinter.Tk instance before you can start churning out StringVars:

>>> import Tkinter as tk
>>> v = tk.StringVar()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.5/lib-tk/Tkinter.py", line 257, in __init__
    Variable.__init__(self, master, value, name)
  File "/usr/lib/python2.5/lib-tk/Tkinter.py", line 188, in __init__
    self._tk = master.tk
AttributeError: 'NoneType' object has no attribute 'tk'
>>> root = tk.Tk()
>>> v = tk.StringVar()
>>> v.set(42)
>>> v.get()
'42'

Peter




More information about the Python-list mailing list