Hi PyStyler,
wow, ich bin mir nicht sicher, ob ich mit meiner jetzigen Erfahrung einen solch anspruchsvollen Code zusammenbekommen hätte (so dass er auch noch funktioniert)! Wie kommst Du auf diese (sorry) "Hintertürfunktionen" getattr und setattr? Die kann man gebrauchen, wenn man Namen deklarieren will, die als Strings vorliegen und später direkt als Name aufgerufen werden sollen, etwa so:
Code: Alles auswählen
>>> class dummy:pass
>>> test = dummy()
>>> setattr(test,"a", "Hallo welt")
>>> test.a
'Hallo welt'
Meistens kann man das aber schöner über Dictionaries oder sogar Listen lösen. In diesem Fall brauchst nichts außer dem eingangs definierten Dictionary.
Diese Klasse macht zumindest äußerlich das gleiche:
Code: Alles auswählen
class Demo:
def __init__(self, fenster):
self.root=fenster
self.wdict= {'aname': 10,
'cname': 30,
'bname': 20,
'dname': 40
}
## Wofuer brauchst Du die Frames??
#for xv in range(len(self.wdict)):
# setattr(self, 'of%s' %xv, Frame(self.root) )
for name, wert in self.wdict.items():
## Funktion die die Ausgabefunktion aufruft
## der Wert koennte eventuell auch gleich hier ausgegben werden
def command_function(wert = wert):
self.ausgabe(wert)
#print wert ## Alternative
Button(fenster, text=name, width=14, height=4,command=command_function)\
.pack(side=LEFT, padx=2, pady=2, expand=YES, fill=BOTH)
def ausgabe(self, x):
"""Gibt den Parameterwert x aus"""
print x
Sie legt aber keine Frames an, in denen nur ein Button liegt. Wenn das Anforderung ist, okay. Aber ich sehe darin im Normalfall keinen Sinn.
Und wenn die Ausgabe-Methode nur den Wert des Buttons ausgeben soll, kannst Du sie Dir auch sparen und den Wert gleich in der Funktion <command_function> ausgeben lassen.
Kurzfassung:
Code: Alles auswählen
class Demo:
def __init__(self, fenster):
self.root=fenster
self.wdict= {'aname': 10, 'cname': 30, 'bname': 20, 'dname': 40}
for name, wert in self.wdict.items():
def command_function(wert = wert): print wert
Button(fenster, text=name, width=14, height=4,command=command_function)\
.pack(side=LEFT, padx=2, pady=2, expand=YES, fill=BOTH)
Grüße,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...