Button-Funktion wird nicht ausgeführt

Fragen zu Tkinter.
Antworten
piepstachel
User
Beiträge: 13
Registriert: Mittwoch 9. Juni 2004, 10:18
Wohnort: 06463 Reinstedt

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?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
piepstachel
User
Beiträge: 13
Registriert: Mittwoch 9. Juni 2004, 10:18
Wohnort: 06463 Reinstedt

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.
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.
piepstachel
User
Beiträge: 13
Registriert: Mittwoch 9. Juni 2004, 10:18
Wohnort: 06463 Reinstedt

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
Antworten