[Tkinter-discuss] Public properties in Tkinter superclasses?
Jeff Cagle
jrcagle at juno.com
Fri Jan 26 03:33:26 CET 2007
Hi all,
I wrote a small "can you match the color?" program. The user is
confronted with a 4-bit/chan. color code such as '#3F6' and must click
the button out of six whose color matches the code. Feedback in the
form of 'that color is #8D2' is given. There is also a Reset button so
that the user can try a different panel of six colors when he desires.
Anyways, because I needed each button to display different feedback, I
ended up inheriting from the Button base class. The original intent was
to create a color public property that could be set and gotten:
----
class MyButton(Button):
HEX = "0123456789ABCDEF"
def __init__(self, master):
self.color = self.rand_color()
Button.__init__(self, master, \
fg=self.color,\
bitmap="gray75",\
width=50,\
command = self.report)
def get_color(self):
return self['fg']
def set_color(self, color):
self['fg'] = color
color = property(get_color, set_color)
def rand_color(self):
return '#' + ''.join([random.choice(self.HEX) for x in range(3)])
def report(self):
Answer.set("That color is %s" % self.color)
----
Oddly, though, the get_color and set_color methods did not work properly
on Reset. For the first run, the colors are set and gotten correctly.
But if the reset code is called,
----
def restart(self):
for x in self.buttons:
x.color = x.rand_color()
s = random.choice(self.buttons).color
self.update()
self.set_display(s)
----
the new colors are not set. Further, if new colors are assigned
manually, the call to get_color() returns the originally assigned
color. BUT, if I comment out the set_ and get_ methods and the 'color =
property()' line, and allow color to be a normal private property, then
this works to assign new colors:
----
def restart(self):
for x in self.buttons:
x.color = x.rand_color()
x['fg'] = x.color
s = random.choice(self.buttons).color
self.update()
self.set_display(s)
----
The only difference appears to be that I'm manually calling x['fg']
instead of relying on set_color() to do so for me. I can't fathom why
that would make a difference.
Do Tkinter classes not allow for property() s?
Thanks,
Jeff
More information about the Tkinter-discuss
mailing list