`self` ist das Objekt auf dem die Methode aufgerufen wurde. Hat also auch den Typ in dem diese Methode definiert wurde. Das dient wie eigentlich alle Objekte dazu Werte und Funktionen zu einer Einheit zusammen zu fassen. Die Funktionen werden dabei zu Methoden mit dem obligatorischen ersten Argument welches immer das Objekt ist auf dem die Methode aufgerufen wurde.
`checkbox` ist der Name eines Attributs das vom `self`-Objekt abgefragt wird, und da Du an diesen Attributnamen im vorherigen Programmverlauf eine Liste bebunden hast, ist das hier jetzt auch tatsächlich eine Liste.
Und von der Liste versuchst Du dann ein Attribut mit dem Namen `get` zu bekommen. Und das geht halt nicht weil Listen kein solches Attribut haben. Wie man an einzelne Elemente einer Liste heran kommt sollte man eigentlich nach jedem Grundlagentutorial wissen. Dafür gibt es den Indexzugriff.
Bei einem `print()` bekommst Du niemals die Objekte selbst ausgegeben ausser in einem einzigen Fall: Bei Zeichenketten. Alles andere muss ja in eine Zeichenkettenrepräsentation umgewandelt werden weil die Ausgabe am Ende Text sein muss. (Hier habe ich jetzt mal grosszügig das Thema Unicode und Kodierungen ignoriert, das wäre an der Stelle noch mal eine zusätzliche Schicht Komplexität.)
Du musst `get()` halt auf den einzelnen Elementen der Liste aufrufen und *das* dann ausgeben. Um etwas mit jedem Element einer Liste zu machen gibt es ``for``-Schleifen. Hier sind wir jetzt aber wieder bei absolutem Basiswissen.
Das mit den Operatoren war keine Fangfrage. Es werden zwei Stück verwendet, der Punktoperator (``.``) und der Indexoperator (``[…]``). Beides sind binäre Operatoren, das heisst sie erwarten zwei Operanden.
Beim Punktoperator muss links ein beliebiger Ausdruck stehen der zu einem Objekt ausgewertet wird und rechts ein Name der als Attribut auf dem ersten Operanden existiert. Das Ergebnis ist der Wert des Attributs. (Hier habe ich mal die Fälle „Objekt kann auch auf nicht existierende Attribute reagieren”, und Properties weggelassen.)
Beim Indexoperator muss davor ein beliebiger Ausdruck stehen der zu einem Objekt ausgewertet wird das den Indexzugriff erlaubt und zwischen den Klammern ein beliebiger Ausdruck den der andere Operand als Indexwert akzeptiert. Der Ausdruck in den Klammern wird grundsätzlich ausgewertet bevor der Indexzugriff gemacht wird. Das Ergebnis ist was auch immer der erste Operand für den Indexwert liefert.
Punkt- und Indexoperator haben die gleiche Bindungstärke, das heisst der gesamte Ausdruck wird von links nach rechts ausgewertet.
Oder auf ”Buchstaben verteilt” was ich ja gefragt hatte:
Code: Alles auswählen
self.checkboxen.get[1]
# =>
a = self # Das Objekt auf dem die Methode aufgerufen wurde.
b = a.checkboxen # Das Attribut `checkboxen`, eine Liste mit `StringVar`-Objekten.
c = b.get # FEHLER weil Listen kein `get`-Attribut haben.
d = 1
e = c[d]
Zu `d` und `e` kommt es in der Ausführung wegen des `AttributeError` nicht mehr also kann man bei `e` auch nichts über Wert und Typ sagen weil Wert und damit Typ von `c` undefiniert ist.
Ausgerechnet das ``in`` in der ``for … in …:``-Syntax ist übrigens *kein* Operator sondern Teil der Schleifenanweisung. Es gibt aber in der Tat auch den ``in``-Operator. Ebenfalls ein binärer Operator der links einen Ausdruck erwartet der zu einem beliebigen Objekt ausgewertet wird und rechts ein Objekt das den Test implementiert und das Ergebnis ist ein Wahrheitswert.