Wo wird
Checkbutton-Objekt an self.g gebunden?
Wir haben bis jetzt doch nun mal nicht mit verbindungen gearbeitet sondern immer nur mit schleifen das eine Zahl z.B. immer größer wird und neu angezeigt wird bis die den Wert 100 hat. Das auch nie mit oberflächen sondern immer nur in dieser Console. Über solche Schleifen geht auch nur unsere Prüfung. Solles es mit diesen oberflächen selber versuchen oder wenn wir nicht weiter kommen uns irgendwo hilfe suchen. Ich versuche es ja, versuche ja genauso hilfe zu bekommen.
Wo ist der fehler
- pillmuncher
- User
- Beiträge: 1484
- Registriert: Samstag 21. März 2009, 22:59
- Wohnort: Pfaffenwinkel
@tigerwood: Was BlackJack mit "einen Wert an einen Namen binden" meint, ist das hier:
Man könnte es auch "Zuweisung" nennen, in diesem Beispiel: Dem Namen x wird der Wert 123 zugewiesen.
Probier das hier mal aus und versuch zu verstehen, was da genau passiert, dann sollte es klar werden:
Code: Alles auswählen
>>> x = 123
>>> x
123
Probier das hier mal aus und versuch zu verstehen, was da genau passiert, dann sollte es klar werden:
Code: Alles auswählen
>>> class Foo:
... def __init__(self, v):
... self.value = v
... def double_value(self):
... self.value *= 2
...
>>> f = Foo(123)
>>> f.value
123
>>> x = f.double_value()
>>> x is None
True
>>> f.value
246
>>> y = Foo(321).double_value()
>>> y is None
True
In specifications, Murphy's Law supersedes Ohm's.
Bei dem Programm steige ich ja auch durch da habe ich keine Probleme und sowas kommt auch nur in der Prüfung.
Ich verliere irgendwie nur den überblick mit diesem ganzen grid(), self(), den Oberflächen usw.
Code: Alles auswählen
>>> class Foo:
... def __init__(self, v):
... self.value = v
... def double_value(self):
... self.value *= 2
...
>>> f = Foo(123) #ERSTELLEN DER ZAHL 123
>>> f.value
123
>>> x = f.double_value() #ZUWEISUNG DER ZAHL 123 AN X
>>> x is None
True
>>> f.value
246
>>> y = Foo(321).double_value()
>>> y is None
True
Zuletzt geändert von Anonymous am Mittwoch 31. Mai 2017, 20:37, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
@tigerwood: wenn Du den Überblick verlierst, dann hast Du zu viel in einer Funktion stehen. Im Moment geht es aber nur um EINE Zeile, und ob es nun self.g oder x heißt, grid oder double_value spielt bei Deinem Problem keine Rolle.
Was spielt dann bei meinem Problem eine Rolle. Muss da irgendwas umbennen oder self() oder grid() irgendwo weg oder fehlt noch was.
Wir haben es nur so einmal von unserem Dozenten gezeigt bekommen das vorne immer (self,...) und dahinter .grid(...) ist.
Darum weiß ich jetzt auch nicht genau was da jetzt zuviel stehen soll
Wir haben es nur so einmal von unserem Dozenten gezeigt bekommen das vorne immer (self,...) und dahinter .grid(...) ist.
Darum weiß ich jetzt auch nicht genau was da jetzt zuviel stehen soll
@tigerwood: Du sagst, Du verstehst die Zeilen von pillmuncher, dann mußt Du nur noch die Struktur Deiner Zeile vergleichen und das Prinzip übertragen.
Um es nochmal deutlich zu machen, diese beiden Zeilen sind strukturell gleich:
Um es nochmal deutlich zu machen, diese beiden Zeilen sind strukturell gleich:
Code: Alles auswählen
y = Foo(321).double_value()
Code: Alles auswählen
self.g = Checkbutton(labelfr, text="Großbuchstaben", variable=self.groß).grid(row=3, column=0, padx=5, pady=5)
- pillmuncher
- User
- Beiträge: 1484
- Registriert: Samstag 21. März 2009, 22:59
- Wohnort: Pfaffenwinkel
Nein, das ist falsch. Die Zahl 123 wird nirgends "erstellt", die gibt es einfach, und hier wird mit ihr als Argument ein Foo-Objekt initialisiert. Deswegen heißt die Methode übrigens __init__().tigerwood hat geschrieben:Code: Alles auswählen
>>> f = Foo(123) #ERSTELLEN DER ZAHL 123
Nein, eben genau nicht. double_value() ist eine Methode, die den Zustand des Objekts, auf dem sie aufgerufen wird - hier f - ändert, aber nichts zurückgibt. Dieses nichts hat in Python einen Namen: None. Wenn du diesen Rückgabewert einem Namen zuweist, welchen Wert hat dann anschließend dieser Name?tigerwood hat geschrieben:Code: Alles auswählen
>>> x = f.double_value() #ZUWEISUNG DER ZAHL 123 AN X
Ich versuch es nochmal etwas weniger abstrakt:
Code: Alles auswählen
>>> class Person:
... def __init__(self, name, kontostand):
... self.name = name
... self.kontostand = kontostand
... def zahle_ein(self, betrag):
... self.kontostand += betrag
...
>>> p = Person('Hansi', 123.45)
>>> p.name
'Hansi'
>>> p.kontostand
123.45
>>> p.zahle_ein(45.67)
>>> p.kontostand
169.12
>>> q = Person('Gretel', 99.99).zahle_ein(100.00)
>>> q is None
True
>>> q.zahle_ein(555.55)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'zahle_ein'
Und nun die € 1.000.000,00 Frage: Was gibt diese Methode als Ergebnis zurück?
In specifications, Murphy's Law supersedes Ohm's.
In diesem Bereich ist mein fehler, in Zeile 3. Was ich nicht weiß was da genau hin muss bzw. wie ich das ändern muss oder ob was gelöscht werden muss. Versuche da ja schon alles möglich aber komme zu keiner Lösung
1 def print_value(self, val):
2 ...if self.groß.get() + self.klein.get() + self.zahl.get() == 0 + self.sonder.get() == 0:
3 ...... self.g.select()
4 ...... self.groß.set(1)
5 ...selection = (self.groß.get(), self.klein.get(), self.zahl.get(),self.sonder.get())
6 ...text_password = generate_password(int(val), selection)
7 ...self.entry.config(state='normal')
8 ...self.entry.delete(0, 'end')
9 ...self.entry.insert('end', text_password
1 def print_value(self, val):
2 ...if self.groß.get() + self.klein.get() + self.zahl.get() == 0 + self.sonder.get() == 0:
3 ...... self.g.select()
4 ...... self.groß.set(1)
5 ...selection = (self.groß.get(), self.klein.get(), self.zahl.get(),self.sonder.get())
6 ...text_password = generate_password(int(val), selection)
7 ...self.entry.config(state='normal')
8 ...self.entry.delete(0, 'end')
9 ...self.entry.insert('end', text_password
- pillmuncher
- User
- Beiträge: 1484
- Registriert: Samstag 21. März 2009, 22:59
- Wohnort: Pfaffenwinkel
@tigerwood: In Zeile 45.
In specifications, Murphy's Law supersedes Ohm's.
- pillmuncher
- User
- Beiträge: 1484
- Registriert: Samstag 21. März 2009, 22:59
- Wohnort: Pfaffenwinkel
@tigerwoods: Nein, da muss was weg. Schau dir nochmal alle meine Beiträge an und versuch diese auf dein Problem zu übertragen. Hier gibt's Hilfe zur Selbsthilfe, keinen fertigen Code.
Aber das noch:
Aber das noch:
Code: Alles auswählen
>>> p = Person('Hansi', 123.45) # Erzeugt eine Person und bindet diese an den Namen p.
>>> p is None # Ist p == None? Natürlich nicht, sondern p == Person('Hansi', 123.45)
False
>>> p.kontostand # Was ist der Konstostand von p?
123.45
>>> q = Person('Gretel', 99.99).zahle_ein(100.00) # Erzeugt eine Person, ruft darauf eine Methode auf und bindet das Ergebnis des Methodenaufrufs an den Namen q. Die Methode liefert als Ergebnis None zurück.
>>> q is None # Ist q == None? Natürlich, das war ja das Ergebnis des Methodenaufrus.
True
>>> q.kontostand # Was ist der Konstostand von q? Wenn q == None ist? None hat keinen Kontostand, deswegen:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'kontostand'
In specifications, Murphy's Law supersedes Ohm's.
- pillmuncher
- User
- Beiträge: 1484
- Registriert: Samstag 21. März 2009, 22:59
- Wohnort: Pfaffenwinkel
@tigerwood: Vergleich mal:
Und jetzt versuch zu verstehen, was meine bisherigen Beiträge damit zu tun haben.
Code: Alles auswählen
self.g = Checkbutton(labelfr, text="Großbuchstaben", variable=self.groß).grid(row=3, column=0, padx=5, pady=5)
vs.
self.g = Checkbutton(labelfr, text="Großbuchstaben", variable=self.groß)
In specifications, Murphy's Law supersedes Ohm's.
- pillmuncher
- User
- Beiträge: 1484
- Registriert: Samstag 21. März 2009, 22:59
- Wohnort: Pfaffenwinkel
@tigerwood: Die darauffolgenden Zeilen sind ja ebenfalls kaputt, das ist nur bisher nicht aufgefallen, weil vorher schon mit einer Exception abgebrochen wurde.
Und natürlich musst du die grid()-Methode immer noch aufrufen, aber nicht bei der Zuweisung, sondern danach:
Es hilft aber alles nichts, - ohne zu verstehen, was du da tust, kannst du das nicht lösen. Und das Verstehen kann dir keiner abnehmen.
Und natürlich musst du die grid()-Methode immer noch aufrufen, aber nicht bei der Zuweisung, sondern danach:
Code: Alles auswählen
self.g = Checkbutton(labelfr, text="Großbuchstaben", variable=self.groß)
self.g.grid(row=3, column=0, padx=5, pady=5)
In specifications, Murphy's Law supersedes Ohm's.
Du meinst also alle Checkbuttons auf 2 Zeilen verteilen.
Ich bekomme dann nur wieder einen fehler.
Wenn ich das mit allen Zeilen mache wo ein grid() hinter ist die auf 2 verteilen kommt der gleiche fehler.
line 25, in print_value
self.Ausgabe.config(state='normal')
AttributeError: 'Application' object has no attribute 'Ausgabe'
Ich bekomme dann nur wieder einen fehler.
Wenn ich das mit allen Zeilen mache wo ein grid() hinter ist die auf 2 verteilen kommt der gleiche fehler.
line 25, in print_value
self.Ausgabe.config(state='normal')
AttributeError: 'Application' object has no attribute 'Ausgabe'
- pillmuncher
- User
- Beiträge: 1484
- Registriert: Samstag 21. März 2009, 22:59
- Wohnort: Pfaffenwinkel
@tigerwood: Der Fehler ist in Zeile 58 in dem von dir geposteten Code.
In specifications, Murphy's Law supersedes Ohm's.