Seite 2 von 2
Re: Wurzelrechner
Verfasst: Sonntag 2. Dezember 2012, 09:02
von SemperPython
/me hat geschrieben: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 solltest dich fragen, woher die Fehlermeldung kommt.
Du versuchst
en**0.5 zu berechnen. Jetzt schau dir bitte dein Programm an. Was ist
en für ein Datentyp?
en ist ein String und ich versuch ich umzuwandeln.
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.
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.
Ich muss mich wohl zufrieden geben,dann man ein String nicht in ein Integer umwandeln kann.
Re: Wurzelrechner
Verfasst: Sonntag 2. Dezember 2012, 09:20
von BlackJack
@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.
Re: Wurzelrechner
Verfasst: Sonntag 2. Dezember 2012, 10:02
von Sirius3
@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
Re: Wurzelrechner
Verfasst: Sonntag 2. Dezember 2012, 14:10
von SemperPython
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:
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()
Re: Wurzelrechner
Verfasst: Sonntag 2. Dezember 2012, 18:44
von /me
SemperPython hat geschrieben:Ich habe mit Hilfe einer anderen Person das Problem gelöst.
Das ist prima, aber hast du das Problem in deinem ursprünglichen Code auch verstanden?
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.
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.
Re: Wurzelrechner
Verfasst: Montag 3. Dezember 2012, 14:58
von SemperPython
/me hat geschrieben:SemperPython hat geschrieben:Ich habe mit Hilfe einer anderen Person das Problem gelöst.
Das ist prima, aber hast du das Problem in deinem ursprünglichen Code auch verstanden?
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.
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.
Verstanden habe ich mein Problem.Ich hab mit en oder en.get() versucht zu rechnen, anstatt mit eingabe und habe eingabe falsch umgewandelt.
Re: Wurzelrechner
Verfasst: Montag 3. Dezember 2012, 15:14
von snafu
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.
Re: Wurzelrechner
Verfasst: Montag 3. Dezember 2012, 15:50
von cofi
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.
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.
Seit der Erfindung von textvervollstaendigenden Editoren ist die Tippgeschwindigkeit/-faulheit einfach keine Ausrede mehr fuer schlechte, weil zu kurze, Variablennamen.
Re: Wurzelrechner
Verfasst: Montag 3. Dezember 2012, 18:38
von SemperPython
So.
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()
Re: Wurzelrechner
Verfasst: Sonntag 30. Juni 2019, 07:11
von Damaskus
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.
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()
Fehler:
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'