Seite 2 von 2

Re: Wo ist der fehler

Verfasst: Mittwoch 31. Mai 2017, 19:59
von Sirius3
@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:

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)

Re: Wo ist der fehler

Verfasst: Mittwoch 31. Mai 2017, 20:21
von pillmuncher
tigerwood hat geschrieben:

Code: Alles auswählen

>>> f = Foo(123)      #ERSTELLEN DER ZAHL 123
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

>>> x = f.double_value()     #ZUWEISUNG DER ZAHL 123 AN X
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?

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'
Schau dir insbesondere die Zeilen 8 und 16 an und vergleiche sie. Offensichtlich wird in Zeile 8 ein Person-Objekt erzeugt und an den Namen p gebunden. In Zeile 16 wird ebenfalls ein Person-Objekt erzeugt, aber das wird nicht an einen Namen gebunden, sondern auf ihm wird die Methode zahle_ein() aufgerufen, und deren Ergebnis wird dann an q zugewiesen.

Und nun die € 1.000.000,00 Frage: Was gibt diese Methode als Ergebnis zurück?

Re: Wo ist der fehler

Verfasst: Mittwoch 31. Mai 2017, 20:26
von tigerwood
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

Re: Wo ist der fehler

Verfasst: Mittwoch 31. Mai 2017, 20:32
von Sirius3
@tigerwood: nein, der Fehler ist wo ganz wo anders, was wir Dir hier auch schon seit einer Ewigkeit schreiben. pillmuncher ist da sehr geduldig im Erklären.

Re: Wo ist der fehler

Verfasst: Mittwoch 31. Mai 2017, 20:35
von tigerwood
Kann man mir nicht zumindest sagen in welcher Zeile, dann würde ich das sicher alles verstehen was hier geschrieben wird.

Re: Wo ist der fehler

Verfasst: Mittwoch 31. Mai 2017, 20:41
von pillmuncher
@tigerwood: In Zeile 45.

Re: Wo ist der fehler

Verfasst: Mittwoch 31. Mai 2017, 20:56
von tigerwood
Dann muss in die Zeile noch was dazu?
wie oben bei der Zeile 8 noch das zahle_zu mit hin müsste

Re: Wo ist der fehler

Verfasst: Mittwoch 31. Mai 2017, 21:14
von pillmuncher
@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:

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'

Re: Wo ist der fehler

Verfasst: Mittwoch 31. Mai 2017, 21:25
von tigerwood
Da kann doch schon nichts mehr weg. :K

Re: Wo ist der fehler

Verfasst: Mittwoch 31. Mai 2017, 21:37
von pillmuncher
@tigerwood: Vergleich mal:

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ß)
Und jetzt versuch zu verstehen, was meine bisherigen Beiträge damit zu tun haben.

Re: Wo ist der fehler

Verfasst: Mittwoch 31. Mai 2017, 21:42
von tigerwood
Wenn ich das jetzt richtig verstehe muss
.grid(row=3, column=0, padx=5, pady=5)
weg.
Nur dann öffnet sich das Programm nicht mehr und wenn sich das Programm öffnen würde würde man den Button nicht mehr sehen

Re: Wo ist der fehler

Verfasst: Mittwoch 31. Mai 2017, 21:45
von tigerwood
Habe jetzt nochmal das Programm aus dem Forum kopiert weil meins ja schon wieder total anders war.
Das programm öffnent sich aber der Button wird jetzt nicht angezeigt.

Re: Wo ist der fehler

Verfasst: Mittwoch 31. Mai 2017, 21:51
von pillmuncher
@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:

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)
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.

Re: Wo ist der fehler

Verfasst: Mittwoch 31. Mai 2017, 22:04
von tigerwood
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'

Re: Wo ist der fehler

Verfasst: Mittwoch 31. Mai 2017, 22:08
von pillmuncher
@tigerwood: Der Fehler ist in Zeile 58 in dem von dir geposteten Code.

Re: Wo ist der fehler

Verfasst: Mittwoch 31. Mai 2017, 22:11
von tigerwood
Die Zeile muss auch in 2 geteilt werden, nur wenn ich das mache habe ich doch den gleichen fehler

Re: Wo ist der fehler

Verfasst: Mittwoch 31. Mai 2017, 22:17
von pillmuncher
@tigerwood: Du musst schon genau hinschauen. Ausgabe ist nicht dasselbe wie self.Ausgabe.

Willst du jetzt wirklich einen Fehler nach dem anderen hier schriftlich vorlesen und dein Programm zeilenweise von mir richten lassen? Was wirst du dann hinterher gelernt haben?

Re: Wo ist der fehler

Verfasst: Mittwoch 31. Mai 2017, 22:37
von tigerwood
Es läuft, habe den rest jetzt so gefunden.
Die letzten hinweise waren gut. Danke nochmal

Ein fehler habe ich doch noch den ich suchen muss. Die Scrolleiste unter der Ausgabe macht noch nicht ganz was die soll. Springt immer gleich nach rechts zurück.
Da fehlt noch irgendein befehl, es muss in diese richtung gehen
self.Ausgabescrollen["xscrollcommand"] = self.Ausgabescrollen.set
dieser will noch nicht ganz