Seite 1 von 1

Button-Funktion wird nicht ausgeführt

Verfasst: Dienstag 1. März 2005, 10:37
von piepstachel
Hallo,

Ich habe eine Oberfläche mit Tkinter entworfen. Dabei habe ich mehrere Klassen kreiert. Leider bekomme ich die Button-Funktion der am tiefsten verschachtelten Klasse nicht zum Laufen. Die Struktur der Oberfläche sieht folgendermaßen aus:

Code: Alles auswählen

class Application:
    :

class MainWindow(Application):
    :
    self.x = WorkSpace()
    :

class Workspace:
    :
    self.y = Toolbar()
    :

class ToolBar:

    def __init__(self, location, tb):
 
        :
        for image, callbackname in tb:
            self.button(PhotoImage(file = image))
            Button(self.toolbar, image = self.button, command = callbackname).grid(row = 0, column = self.bcolumn)
 
Ich hoffe, diese Code-Schnipsel reichen für die Schilderung meines Problems aus:
Die eigentlichen Programm-Funktionen sind Methoden der Klasse Application. In der Klasse Toolbar gibt es eine Liste (tb) die die Icons für die Button und die dahinterliegende Funktion enthält. Ich kann machen, was ich will. Wenn ich in ToolBar eine Instanz der Klasse Application erzeuge und dann den Methoden-Aufruf im Klartext in Button(...) eintrage, funktioniert es, wenn ich den Methoden-Aufruf programmtechnisch erzeuge (Instanz der Klasse + Methodenaufruf aus der Liste) dann funzt es nicht (Fehlermeldung: Instanz der Klasse Application hat keine Methode ... - HAT SIE ABER DOCH ???).
Hat vielleicht jemand eine Idee, was ich falsch mache?

Verfasst: Dienstag 1. März 2005, 13:44
von Leonidas
Guck mal mit print ob callbackname wirklich auch der richtige ist... du kannst auch mal die Callbacks per hand aufzurufen versuchen und gucken ob es aus der for Schleife geht, also etwa:

Code: Alles auswählen

for callbackname in tb:
    callbackname()
Ich weiß jetzt nicht wie die Callbacks in Tk aussehen, aber ich denke das daran liegt dass die Funtion nicht erreicht wird, oder in einer anderen Klasse ist, da musst du etwas print Debugging machen, dann wird das schon.

Verfasst: Dienstag 1. März 2005, 15:42
von piepstachel
Ich habe mir zu Kontrollzwecken die Variable callbackname auch schon ausgeben lassen.
Es ist genau dieselbe, wie die, die ich im Klartext in die Button-Anweisung eingefügt habe - Wie gesagt: im Klartext hat sie funktioniert.

Verfasst: Dienstag 1. März 2005, 23:21
von BlackJack
Mal ein Schuss ins Blaue: Du weisst das folgendes gilt:

Code: Alles auswählen

In [23]: int == 'int'
Out[23]: False
Trägst Du per Hand command=foo oder command='foo' ein und was steht in `tb` -- foo oder 'foo'?

Soweit ich weiss will TKiner da ein Funktionsobjekt haben und keine Zeichenkette.

Verfasst: Mittwoch 2. März 2005, 11:34
von piepstachel
Hallo BlackJack,

Du hattest vollkommen Recht: TKinter möchte im Methodenaufruf von Button ein Funktionsobjekt (für command = ...)
Erfolg hatte ich nun mit folgender Variante:

Code: Alles auswählen

class Application:
    :

class MainWindow(Application):
    :
    self.x = WorkSpace()
    :

class Workspace:
    :
    self.y = Toolbar()
    :

class ToolBar:

    def __init__(self, location, tb):
        :
        self.app = Application()
        for image, callbackname in tb:
            callback = getattr(self.app, callbackname)
            self.button(PhotoImage(file = image))
            Button(self.toolbar, image = self.button, command = callback).grid(row = 0, column = self.bcolumn) 
Vielen Dank BlackJack und allen, die mir geholfen haben.

Gruß piepstachel