471,056 Members | 1,534 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 471,056 software developers and data experts.

Tkinter checkbuttons and variables

from Tkinter import *

states = []

def onpress(i):
states[i] = not states[i]
root = Tk()
for i in range(10):
chk = Checkbutton(root, text= str(i), command=lambda i=i:
onpress(i))
chk.pack(side=LEFT)
states.append(0)
root.mainloop()
print states

after exiting i get everything like it suppose to but when i put command
like this:
command=lambda: onpress(i)
i got only last checkbutton check.

Why i have to pass this default argument?
btw i have python 2.5
thx
Feb 21 '07 #1
2 1941
Gigs_ schrieb:
from Tkinter import *

states = []

def onpress(i):
states[i] = not states[i]
root = Tk()
for i in range(10):
chk = Checkbutton(root, text= str(i), command=lambda i=i: onpress(i))
chk.pack(side=LEFT)
states.append(0)
root.mainloop()
print states

after exiting i get everything like it suppose to but when i put command
like this:
command=lambda: onpress(i)
i got only last checkbutton check.

Why i have to pass this default argument?
Because python creates a closure around the lambda that allows
expressions inside the lambda to access surrounding variables. However,
these variables are looked up at _runtime_, when the command is actually
executed. Naturally, the value of i then is 9, because that's what it
has been assigned in the last loop iteration.

Diez
Feb 21 '07 #2
On Wed, 21 Feb 2007 15:50:57 +0100, Gigs_ <gi**@hi.t-com.hrwrote:
from Tkinter import *

states = []

def onpress(i):
states[i] = not states[i]
root = Tk()
for i in range(10):
chk = Checkbutton(root, text= str(i), command=lambda i=i:
onpress(i))
chk.pack(side=LEFT)
states.append(0)
root.mainloop()
print states

after exiting i get everything like it suppose to but when i put command
like this:
command=lambda: onpress(i)
i got only last checkbutton check.

Why i have to pass this default argument?
I'm basically not answering your question here, but the usual way to geta
checkbuttons's state is as follows:

states = []
root = Tk()
for i in range(10):
stateVar = BooleanVar()
chk = Checkbutton(root, text=str(i), variable=stateVar)
chk.pack(side=LEFT)
states.append(stateVar)
root.mainloop()
print [v.get() for v in states]

If you want to get the value of one of your states, use the get() method
on BooleanVar. If you want to change such a state, use the set(value)
method.

HTH
--
python -c "print ''.join([chr(154 - ord(c)) for c in
'U(17zX(%,5.zmz5(17l8(%,5.Z*(93-965$l7+-'])"
Feb 21 '07 #3

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

6 posts views Thread by max(01)* | last post: by
reply views Thread by leo001 | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.