Sein oder Nicht-Sein einer Member Variable einer Classses

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Mungo1981
User
Beiträge: 131
Registriert: Montag 27. August 2012, 19:05

Liebe Community,
Ich stehe mal wieder auf dem Schlauch.

Ich habe eine Classe von einem TKInter abgeleitet:

Code: Alles auswählen

class Example(tk.Frame ): 
In dieser Erzeuge ich eine Tabelle aus einer Matrix von Entry-Widgets

Code: Alles auswählen

 def creatingDerivativTables(self):
        self.pbt2 = tk.PanedWindow(self.m1)
        pbtA = tk.PanedWindow(self.pbt2)
        pbtB = tk.PanedWindow(self.pbt2)
        pbtRes = tk.PanedWindow(self.pbt2)
        
        self.derivatTableA = Tables(pbtA) 
        self.derivatTableB = Tables(pbtB)
        self.derivatTableRes = Tables(pbtRes)
        
        self.pbt2.add(pbtA)
        self.pbt2.add(pbtB)
        self.pbt2.add(pbtRes)
    
        self.m1.add(self.pbt2)


Und nun kommt das Problem:
Ich müsste self.derivativeTableA mit self.derivativeTableB vertauschen - Werte mäßig.

Code: Alles auswählen

 def doInterchange(self, mode):
        if mode == "AB":
            self.derivatTableA.interchange(self.derivatTableB)
leider bekomme ich immer gemeldet, dass es keine self.derivativeTableA
gäbe.

Kann mir irgendjemand vielleicht kurz auf die Sprünge helfen :shock: :? :shock:
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Fehlermeldung ist ja recht eindeutig. Da du nicht den gesamten Code zeigst, kann man nur raten. Wenn creatingDerivativTables gelaufen ist, dann *muss* self.derivatTableA existieren. Ausser du loeschst das irgendwie. Also ist creatingDerivativTables nicht gelaufen zu dem Zeitpuntk, wo da was ausgetauscht werden soll.
Mungo1981
User
Beiträge: 131
Registriert: Montag 27. August 2012, 19:05

Ok, du hast ja vollkommen Recht.
Ich bin jetzt über 2 Jahre raus aus Python
Und versuche mich seit 3 Tagen wieder drin.
Also erst einmal Entschuldigung:

Das Problem liegt an einer sehr Merkwürdigen Stelle.

Code: Alles auswählen

moveTableMenu.add_command(label="Interchange Table A with B", command=self.doInterchange("AB"))
An dieser Stelle - so dachte ich - soll vereinbart werden dass ein Funktionsaufruf von "self.dointerchange" mit dem Parameter "AB" vereinbart wird.
Nur Python denkt es soll hier tatsächlich die Funktion "self.doInterchange("AB")" ausgeführt werden - was nicht meinen Erwartungen entspricht.

Habt ihr vielleicht eine Idee ob es irgendwie möglich ist das richtige zu erreichen. Also:
  • Eine Vereinbarung dass die Funktion self.doInterchange mit dem Parameter "AB" aufgerufen wird
Ein schon etwas klügerer

Mungo1981
Sirius3
User
Beiträge: 17797
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie __deets__ schon geschrieben hat, kann man ohne den kompletten Code nichts sagen. Das Stückwerk und Deine Erklärungsversuche helfen da nur bedingt.
Auch der komplette Traceback ist wichtig, und nicht Deine gekürzte Version.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das geht wahlweise mit einem lambda oder functools.partial. Wird hier permanent besprochen, einfach mal ein bisschen suchen.
Mungo1981
User
Beiträge: 131
Registriert: Montag 27. August 2012, 19:05

Entschuldigung aber wäre es da nicht einfacher, für jede Menu Option:

viewtopic.php?f=18&t=48429

Eine einfache Funktion zu schreiben
wären in meine Falle nur 6 zusätzliche Funktionen.

Ein ermunterter

Mungo1981
Benutzeravatar
__blackjack__
User
Beiträge: 13202
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Mungo1981: Nein‽
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Mungo1981
User
Beiträge: 131
Registriert: Montag 27. August 2012, 19:05

Ok,
Wenn es einfacher ist eine Lambda zu schreiben ...
... dann her mit der Anleitung.
Mungo1981
User
Beiträge: 131
Registriert: Montag 27. August 2012, 19:05

Wäre es für obige Funktion einfach:

Code: Alles auswählen

moveTableMenu.add_command(label="Interchange Table A with B", command=map(lambda x:  self.Interchange(x),  "AB"))
Ein

Mungo1981

der es mal wagen möchte
Mungo1981
User
Beiträge: 131
Registriert: Montag 27. August 2012, 19:05

Hab gerade folgende Stelle gefunden:

viewtopic.php?f=18&t=43322&p=329669&hil ... ue#p329669

Da geht es praktisch genau um mein Problem .... nur bin ich ein blutiger Anfänger, noch dazu ein Künstler noch dazu seit 2 Jahren aus dem Thema und versuche seit 3 Tagen meine Probleme wieder mit Python zu lösen.
Mungo1981
User
Beiträge: 131
Registriert: Montag 27. August 2012, 19:05

Hallo hab jetzt folgendes:
moveTableMenu.add_command(label="Interchange Table A with B", command=map(lambda x: self.doInterchange(x), "AB"))

Es wird sxchon einmal nicht mehr Ausgeführt - wenn es übergeben wird ...
.... nur leider wird es auch nicht mehr auf Kommando ausgeführt.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Woher hast du denn das map? Das hat hier nichts verloren.

Ah. Sehe gerade den Post davor. Nicht alles, was irgendwie mit lambda zu tun hat, ist anwendbar. Der Kontext hier ist tkinter, und da findest du auch speziell Beispiele für.
Mungo1981
User
Beiträge: 131
Registriert: Montag 27. August 2012, 19:05

Ok,
jetzt hab ichs

Code: Alles auswählen

l moveTableMenu.add_command(label="Interchange Table A with B", command= lambda : self.doInterchange("AB"))
Ich glaube ich bin gar nicht so Dumm

:D :D :D :D
Benutzeravatar
snafu
User
Beiträge: 6748
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mungo1981 hat geschrieben: Mittwoch 29. April 2020, 21:11 Ich glaube ich bin gar nicht so Dumm

:D :D :D :D
Dann glaub du mal... :)
Antworten