Wurzelrechner

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
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.
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.
Sirius3
User
Beiträge: 18054
Registriert: Sonntag 21. Oktober 2012, 17:20

@semperpython: es hat doch alles so gut angefangen mit tk und Dir. Bis auf eine Kleinigkeit:

Code: Alles auswählen

int(en.get)
hat einen Fehler gemeldet, weil en.get eine Method ist und daraus keine Zahl machen läßt.
Dann bist Du irgendwie falsch abgebogen:

Code: Alles auswählen

int(en**0.5)
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
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()
Benutzeravatar
/me
User
Beiträge: 3560
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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:

Code: Alles auswählen

en = tkinter.Entry(root)
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.
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:

Code: Alles auswählen

en = tkinter.Entry(root)
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.
Benutzeravatar
snafu
User
Beiträge: 6779
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
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()
Benutzeravatar
Damaskus
Administrator
Beiträge: 997
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.

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'
Antworten