Wurzelrechner
Beispielhaft gesprochen versuchst du die Wurzel aus einem Schildchen auf dem eine Zahl steht zu ziehen. Das schlägt fehl, da du aus Schildern keine Wurzeln ziehen kannst. Das bedeutet also du musst irgendwie an die Zahl auf dem Schild kommen und diese weiterverwenden.
Ich komm wirklich nicht mehr weiter.Ich hab jetzt vieles ausprobiert.
Ich hab wirklich keine Ahnung mehr was ich tun soll... :K
Ich hab wirklich keine Ahnung mehr was ich tun soll... :K
Du solltest dich fragen, woher die Fehlermeldung kommt.SemperPython hat geschrieben:Ich komm wirklich nicht mehr weiter.Ich hab jetzt vieles ausprobiert.
Ich hab wirklich keine Ahnung mehr was ich tun soll... :K
Du versuchst en**0.5 zu berechnen. Jetzt schau dir bitte dein Programm an. Was ist en für ein Datentyp?
@SemperPython: Ich habe so ein bisschen den Eindruck Du probierst grundsätzlich einfach nur herum ohne wirklich zu wissen was Du tust. So funktioniert Programmieren nicht. Du musst im Zweifelsfall wissen welchen Typ und Wert jeder einzelne Teilausdruck bei gegebenen Eingabedaten ergibt. Wenn Du das wüsstest, dann wäre Dir auch klar wo der Fehler liegt und wie man ihn behebt. Und zwar durch Anwendung von Wissen und nicht durch herumprobieren. Manchmal findet man etwas auf diese Weise heraus, durch Versuch und Irrtum. Dann muss man aber hinterher auch erklären können warum es vorher nicht funktionierte und nach den Versuchen dann funktioniert. Sonst hat man einfach nur Glück gehabt und nichts dabei gelernt was einen weiter bringt.
en ist ein String und ich versuch ich umzuwandeln./me hat geschrieben:Du solltest dich fragen, woher die Fehlermeldung kommt.SemperPython hat geschrieben:Ich komm wirklich nicht mehr weiter.Ich hab jetzt vieles ausprobiert.
Ich hab wirklich keine Ahnung mehr was ich tun soll... :K
Du versuchst en**0.5 zu berechnen. Jetzt schau dir bitte dein Programm an. Was ist en für ein Datentyp?
Bei Problemen,von denen ich nicht weiß wie ich sie behebe,probiere ich erst mal herum,schaue in meinen Büchern,ob ich etwas vergessen hab und frage dann nach.BlackJack hat geschrieben:@SemperPython: Ich habe so ein bisschen den Eindruck Du probierst grundsätzlich einfach nur herum ohne wirklich zu wissen was Du tust. So funktioniert Programmieren nicht. Du musst im Zweifelsfall wissen welchen Typ und Wert jeder einzelne Teilausdruck bei gegebenen Eingabedaten ergibt. Wenn Du das wüsstest, dann wäre Dir auch klar wo der Fehler liegt und wie man ihn behebt. Und zwar durch Anwendung von Wissen und nicht durch herumprobieren. Manchmal findet man etwas auf diese Weise heraus, durch Versuch und Irrtum. Dann muss man aber hinterher auch erklären können warum es vorher nicht funktionierte und nach den Versuchen dann funktioniert. Sonst hat man einfach nur Glück gehabt und nichts dabei gelernt was einen weiter bringt.
Ich muss mich wohl zufrieden geben,dann man ein String nicht in ein Integer umwandeln kann.
@SemperPython: `en` ist *kein* String — das sagt Dir ja auch die Fehlermeldung sehr deutlich und wir haben dir das hier auch schon gesagt. Und das müsstest Du selbst auf Anhieb an Deinem eigenen Quelltext erkennen können. Du bindest den Namen an ein `Entry`-Objekt. Wie kann das dann eine Zeichenkette sein‽ An welcher Stelle im Code sollte diese „magische” Verwandlung passieren‽
Natürlich kann man eine Zeichenkette die aus Ziffern besteht in eine Zahl umwandeln. Das geht mit der `int()`-Funktion.
Natürlich kann man eine Zeichenkette die aus Ziffern besteht in eine Zahl umwandeln. Das geht mit der `int()`-Funktion.
@semperpython: es hat doch alles so gut angefangen mit tk und Dir. Bis auf eine Kleinigkeit:
hat einen Fehler gemeldet, weil en.get eine Method ist und daraus keine Zahl machen läßt.
Dann bist Du irgendwie falsch abgebogen:
Die Variable en enthält ein Objekt vom Typ Entry, das man aber nicht mit 0.5 potenzieren kann,
was eigentlich auch logisch sein sollte, da man nur mit Zahlen rechnen kann.
Ab dann weiß ich nicht mehr was Du versuchst.
Deshalb nochmal zurück zu anfang:
1. Du hast ein Eingabefeld
2. Du willst den Inhalt des Eingabefeldes als Text
3. Du willst den Text als Zahl
4. Du willst die Zahl mit 0.5 potenzieren.
Für jeden einzelnen Punkt gibt es eine Funktion die Du schon kennst. Punkt 3 und 4
hast Du schon in Deinem ersten Programm erfolgreich programmiert.
Punkt 1 kannst Du auch abhaken, und Punkt 2 steht in jedem Buch zu tkInter.
Grüße
Sirius
Code: Alles auswählen
int(en.get)
Dann bist Du irgendwie falsch abgebogen:
Code: Alles auswählen
int(en**0.5)
was eigentlich auch logisch sein sollte, da man nur mit Zahlen rechnen kann.
Ab dann weiß ich nicht mehr was Du versuchst.
Deshalb nochmal zurück zu anfang:
1. Du hast ein Eingabefeld
2. Du willst den Inhalt des Eingabefeldes als Text
3. Du willst den Text als Zahl
4. Du willst die Zahl mit 0.5 potenzieren.
Für jeden einzelnen Punkt gibt es eine Funktion die Du schon kennst. Punkt 3 und 4
hast Du schon in Deinem ersten Programm erfolgreich programmiert.
Punkt 1 kannst Du auch abhaken, und Punkt 2 steht in jedem Buch zu tkInter.
Grüße
Sirius
Ich habe mit Hilfe einer anderen Person das Problem gelöst.Ein Integer für die Berechnung und ein String für die Ausgabe.
Der Code sieht nun wie folgt aus:
Der Code sieht nun wie folgt aus:
Code: Alles auswählen
import tkinter
root = tkinter.Tk()
def wurzel_berechnen():
try:
eingabe = int(en.get())
lb["text"] = "Ergebnis:" + str(eingabe**(0.5))
except ValueError:
lb["text"] = "Bitte eine Zahl eingeben"
mt = tkinter.Label(root, text="Gebe eine Zahl ein um die Wurzel zu berechnen")
mt.pack()
en = tkinter.Entry(root, width=17)
en.pack()
bw = tkinter.Button(root, text="Berechnen", command=wurzel_berechnen, width=14, height=1)
bw.pack()
lb = tkinter.Label(root, text = "Ergebnis:")
lb.pack()
root.mainloop()
Das ist prima, aber hast du das Problem in deinem ursprünglichen Code auch verstanden?SemperPython hat geschrieben:Ich habe mit Hilfe einer anderen Person das Problem gelöst.
Wiederholen wir das noch mal. Du hattest im Code dies hier:
Code: Alles auswählen
en = tkinter.Entry(root)
Deine klare Ansage mit "en ist ein String" war somit nicht korrekt. Du hättest das auch an der Fehlermeldung "TypeError: unsupported operand type(s) for ** or pow(): 'Entry' and 'float'"sehen können, wo explizit der Typ Entry aufgeführt ist. Im Zweifelsfall streu einfach mal ein print(type(en)) ins Programm ein, dann siehst du den Typ auch. Versuche Fehlermeldungen wirklich zu lesen. Ja, das wirkt am Anfang vielleicht abschreckend, aber es erklärt viele Probleme sehr schnell.
BTW, der Name en ist absolut nichtssagend. Gewöhne dir am Besten gleich deskriptive Namen an. Python läuft nicht dadurch schneller, dass man Bezeichnernamen möglichst kurz hält.
en ist eine Abkürzung.Ich hab es mir angewöhnt,1-2 Zeichen für eine Variable zu verwenden.Aber vom Style her kann ich es verstehen,werde mich umgewöhnen./me hat geschrieben:Das ist prima, aber hast du das Problem in deinem ursprünglichen Code auch verstanden?SemperPython hat geschrieben:Ich habe mit Hilfe einer anderen Person das Problem gelöst.
Wiederholen wir das noch mal. Du hattest im Code dies hier:Jetzt hast du im weiteren Programmverlauf versucht mit en zu rechnen. en ist nun aber weder ein String, noch eine Zahl, sondern das was du definiert hast: ein Objekt vom Typ Entry. Was du brauchtest - und jetzt ja auch hast - ist der von en verwaltete Wert den du mit en.get() bekommst.Code: Alles auswählen
en = tkinter.Entry(root)
Deine klare Ansage mit "en ist ein String" war somit nicht korrekt. Du hättest das auch an der Fehlermeldung "TypeError: unsupported operand type(s) for ** or pow(): 'Entry' and 'float'"sehen können, wo explizit der Typ Entry aufgeführt ist. Im Zweifelsfall streu einfach mal ein print(type(en)) ins Programm ein, dann siehst du den Typ auch. Versuche Fehlermeldungen wirklich zu lesen. Ja, das wirkt am Anfang vielleicht abschreckend, aber es erklärt viele Probleme sehr schnell.
BTW, der Name en ist absolut nichtssagend. Gewöhne dir am Besten gleich deskriptive Namen an. Python läuft nicht dadurch schneller, dass man Bezeichnernamen möglichst kurz hält.
Verstanden habe ich mein Problem.Ich hab mit en oder en.get() versucht zu rechnen, anstatt mit eingabe und habe eingabe falsch umgewandelt.
Du musst dir bei GUI-Programmierung einfach klar machen, dass man den verschiedenen Widgets in aller Regel explizit mitteilen muss, dass man auf ihren Inhalt/Wert zugreifen möchte. Und zum zweiten solltest du beachten, dass Textwidgets eben erstmal nur Text ausliefern. Es kann sein, dass ein Framework auch spezielle Methoden wie `getInt()` oder ähnliches mitbringt, aber bei allgemein gehaltenen Methoden würde ich immer von Zeichenketten ausgehen (mal davon ab, dass sowas in der Doku des Frameworks auch beschrieben sein müsste). Da man aber mit Zeichenketten nicht rechnen kann, ist halt noch die Typumwandlung in einen `int` nötig.
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Die Laenge eines Names sollte reflektieren wie lange sie gebraucht, d.h. an wie vielen Stellen sie benutzt wird. Das heisst, dass eine Schleifenvariable durchaus mal nur ein Zeichen haben kann und man es trotzdem versteht. Aber noch viel wichtiger ist, dass sie reflektiert, was sie repraesentiert. In dem Fall eben, dass sie fuer die Eingabe von Zahlen benutzt wird. Dafuer einen guten Namen zu finden kann aber schwer sein, der zukuenftige Leser wird sich aber bedanken - oder wahrscheinlicher: nicht beschweren.SemperPython hat geschrieben:en ist eine Abkürzung.Ich hab es mir angewöhnt,1-2 Zeichen für eine Variable zu verwenden.Aber vom Style her kann ich es verstehen,werde mich umgewöhnen.
Seit der Erfindung von textvervollstaendigenden Editoren ist die Tippgeschwindigkeit/-faulheit einfach keine Ausrede mehr fuer schlechte, weil zu kurze, Variablennamen.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
So.
Jetzt habe ich mal alle Variablen etc. geändert und hoffentlich halten sich sich auch an den normalen Codestyle.
Jetzt habe ich mal alle Variablen etc. geändert und hoffentlich halten sich sich auch an den normalen Codestyle.
Code: Alles auswählen
import tkinter
fenster = tkinter.Tk()
def wurzel_berechnen():
try:
eingabe = int(Textfeld.get())
Label_unten["text"] = "Ergebnis:" + str(eingabe**(0.5))
except ValueError:
Label_unten["text"] = "Bitte eine Zahl eingeben."
Label_oben = tkinter.Label(fenster, text="Gebe eine Zahl ein um die Wurzel zu berechnen")
Label_oben.pack()
Textfeld = tkinter.Entry(fenster, width=50)
Textfeld.pack()
Button_berechnen = tkinter.Button(fenster, text="Berechnen", command=wurzel_berechnen)
Button_berechnen.pack()
Label_unten = tkinter.Label(fenster, text = "Ergebnis:")
Label_unten.pack()
fenster.mainloop()
- Damaskus
- Administrator
- Beiträge: 995
- Registriert: Sonntag 6. März 2005, 20:08
- Wohnort: Schwabenländle
SemperPython hat geschrieben: ↑Samstag 1. Dezember 2012, 17:06 Arrgh,
tut mir Leid,ich hab sehr viel herumversucht,hab den Fehler wegbekommen,aber nun bekomm ich einen anderen Fehler.Fehler:Code: Alles auswählen
""" Danke an: BlackJack und lunar fuer ihre Verbesserungvorschläge http://www.python-forum.de , ihr seit klasse! """ import tkinter root = tkinter.Tk() def wurzel_berechnen(): while True: try: eingabe = en.get() except ValueError: lb["text"] = "Bitte eine Zahl eingeben" continue lb["text"] = "Ergebnis:" + int(en**0.5) mt = tkinter.Label(root, text="Gebe eine Zahl ein um die Wurzel zu berechnen") mt.pack() en = tkinter.Entry(root) en.pack() bw = tkinter.Button(root, text="Berechnen", command=wurzel_berechnen) bw.pack() lb = tkinter.Label(root, text = "") lb.pack() root.mainloop()
Code: Alles auswählen
Exception in Tkinter callback Traceback (most recent call last): File "C:\Python32\lib\tkinter\__init__.py", line 1399, in __call__ return self.func(*args) File "C:\Users\User\Desktop\Wurzelrechner_v3.py", line 20, in wurzel_berechnen lb["text"] = "Ergebnis:" + int(en**0.5) TypeError: unsupported operand type(s) for ** or pow(): 'Entry' and 'float'