Wo ist der fehler

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
tigerwood
User
Beiträge: 19
Registriert: Dienstag 30. Mai 2017, 21:55

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.
Benutzeravatar
pillmuncher
User
Beiträge: 1482
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@tigerwood: Was BlackJack mit "einen Wert an einen Namen binden" meint, ist das hier:

Code: Alles auswählen

>>> x = 123
>>> x
123
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

>>> 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.
tigerwood
User
Beiträge: 19
Registriert: Dienstag 30. Mai 2017, 21:55

Bei dem Programm steige ich ja auch durch da habe ich keine Probleme und sowas kommt auch nur in der Prüfung.

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
Ich verliere irgendwie nur den überblick mit diesem ganzen grid(), self(), den Oberflächen usw.
Zuletzt geändert von Anonymous am Mittwoch 31. Mai 2017, 20:37, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
tigerwood
User
Beiträge: 19
Registriert: Dienstag 30. Mai 2017, 21:55

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
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@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)
Benutzeravatar
pillmuncher
User
Beiträge: 1482
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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?
In specifications, Murphy's Law supersedes Ohm's.
tigerwood
User
Beiträge: 19
Registriert: Dienstag 30. Mai 2017, 21:55

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
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
tigerwood
User
Beiträge: 19
Registriert: Dienstag 30. Mai 2017, 21:55

Kann man mir nicht zumindest sagen in welcher Zeile, dann würde ich das sicher alles verstehen was hier geschrieben wird.
Benutzeravatar
pillmuncher
User
Beiträge: 1482
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@tigerwood: In Zeile 45.
In specifications, Murphy's Law supersedes Ohm's.
tigerwood
User
Beiträge: 19
Registriert: Dienstag 30. Mai 2017, 21:55

Dann muss in die Zeile noch was dazu?
wie oben bei der Zeile 8 noch das zahle_zu mit hin müsste
Benutzeravatar
pillmuncher
User
Beiträge: 1482
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:

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.
tigerwood
User
Beiträge: 19
Registriert: Dienstag 30. Mai 2017, 21:55

Da kann doch schon nichts mehr weg. :K
Benutzeravatar
pillmuncher
User
Beiträge: 1482
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@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.
In specifications, Murphy's Law supersedes Ohm's.
tigerwood
User
Beiträge: 19
Registriert: Dienstag 30. Mai 2017, 21:55

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
tigerwood
User
Beiträge: 19
Registriert: Dienstag 30. Mai 2017, 21:55

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.
Benutzeravatar
pillmuncher
User
Beiträge: 1482
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:

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.
In specifications, Murphy's Law supersedes Ohm's.
tigerwood
User
Beiträge: 19
Registriert: Dienstag 30. Mai 2017, 21:55

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'
Benutzeravatar
pillmuncher
User
Beiträge: 1482
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.
Antworten