On Tue, 29 Mar 2005 22:32:59 +0200, Pierre Quentel <[EMAIL PROTECTED]> wrote:
Instead of indexing self.lab by strings, you can index them by the attributes themselves : self.lab[self.i], and change line 23 into
for var in (self.s, self,i)
I really think this is asking for trouble: I suppose that the i and s attributes are meant to change at some point in the future, and you're mapping their *values* to the corresponding labels. So if the value changes, you won't be able to get the label again.
For your example, I wouldn't have used the "text" option in the definition of the labels, then "textvariable" in the callback method (procedi) ; I would have used only "text" and no IntVar or StringVar, just an integer and a string :
I would have done exactly the contrary, as it is far more easier to use. Using the textvariable option in Label's does not require you to remember the labels, but only the variables used to hold their contents. I'd also use two mappings: the first mapping a name to a Tkinter variable for the label variables, and the second for the values to give to these variables later.
Here is my version of the class code:
class MiaApp: def __init__(self, genitore): self.mioGenitore = genitore ## Mapping for variables self.variables = { "i" : StringVar(), "s" : StringVar() } ## Mapping for future variable values self.values = { "i" : 42, "s" : "Baobab" } ## Now, create the labels for var in self.variables.values(): ## Default text var.set("[vuota]") ## Create label lb = Label(self.mioGenitore, width=30, relief=RIDGE, textvariable=var) lb.pack() ## The button is no more remembered in an attribute, as it does not seem to be needed but = Button(self.mioGenitore, text = "Vai!", command = self.procedi) but.pack()
def procedi(self): ## Just change the variable values for varName in self.variables.keys(): self.variables[varName].set(self.values[varName])
Note that I only used StringVar's: since the variable holds the *text* for a Label, it is not a good idea to use anything else. I tend to use IntVar, BooleanVar or DoubleVar only when I'm sure it won't ever be set to anything else than an integer, a boolean or a float respectively. So for Label and Entry text variables, I always use a StringVar. In spite of their name, these variable can actually hold anything; you will just get the value you've given to them as text rather than as their original type:
v = StringVar() v.set(42) v.get()
'42'
So if you want to get the integer back, you'll need to convert the value explicitely. This is in fact what is done by Tkinter when using an IntVar, but by doing it yourself, you'll be able to decide what to do if the conversion fails instead of just getting a generic TclError.
HTH -- python -c 'print "".join([chr(154 - ord(c)) for c in "U(17zX(%,5.z^5(17l8(%,5.Z*(93-965$l7+-"])' -- http://mail.python.org/mailman/listinfo/python-list