Seite 1 von 1
Text in Zahl formatieren
Verfasst: Freitag 26. Oktober 2007, 19:09
von Ozim
Hallo,
seit etwa 2 wochen programmiere ich jetzt in python und sitze gerade daran geschriebene programme mit einer Benutzeroberfläsche zu versehen.
Allerdings scheitere ich daran in 2 Feldern Zahlen einzulesen und mit diesen rechnen zu können.
Das einzige was ich gefunden habe war die Zahl in Textformat einzulesen:
Code: Alles auswählen
text2=Entry(f, width=10, background="yellow")
text2.pack()
k=text2.get()
Und den Text mit int() in eine Zahl zu verwandeln:
Aber dabei tritt ein Fehler auf:
Code: Alles auswählen
Exception in Tkinter callback
Traceback (most recent call last):
File "J:\Python25\lib\lib-tk\Tkinter.py", line 1403, in __call__
return self.func(*args)
File "J:\Dokumente und Einstellungen\Klaus\Desktop\Python\Test2.py", line 27, in Start
p=int(k)
ValueError: invalid literal for int() with base 10: ''
Kann mir einer helfen? bin sicher ich bin nur zu blöd zu entdecken was ich amchen muss. Hab auch per google und Forums-Suche nichts gefunden, da es wahrscheinlich zu einfach und selbstverständlich ist.
Hoffe ihr könnt mir helfen,
Danke im vorraus Ozim
Verfasst: Freitag 26. Oktober 2007, 19:35
von pyStyler
Hallo,
kann mir im Moment nicht erklären, wie die Fehlermeldung zustande kommt!
Bei mir würde es so aber trotzdem funktionieren.
Code: Alles auswählen
from Tkinter import *
f = Tk()
text2 = Entry(f, width=10, background='yellow')
text2.pack()
def xprint():
k = text2.get()
p = int(k)
print p + 10
Button(f, text='print', command=xprint).pack()
mainloop()
Gruss
pyStyler
Verfasst: Freitag 26. Oktober 2007, 19:49
von Leonidas
Hallo Ozim, willkommen im Forum,
Ganz einfach: Wenn der String leer ist (''), dann kann ``int()`` nicht funktionieren. Was sollte es denn dann, rein logisch gesehen, ausgeben?
Daher muss du den Fall, dass jemand nichts eingibt vorher abfangen und irgendwie behandeln.
Verfasst: Freitag 26. Oktober 2007, 20:09
von Ozim
Ah danke....
der Fehler ist weg... aber ein neuer da -.-
die ganze Anwendung besteht aus 3 fenstern.
der fehler eben war noch im 2ten. jetzt taucht er innerhalb der definition für das 3te Fenster auf
naja ich versuch den ma zu beheben...
vielen Dank!!!

Verfasst: Freitag 26. Oktober 2007, 20:12
von Andy
Hallo Ozim! Herzlich Willkommen im Forum!
Entweder ich habe gerade Tomaten auf den Augen, oder Du übergibst keinerlei Engaben an das Entry, weil es bereits zu einen ValueError kam.
Und das was hinter den Doppelpunkt steht, ist das entscheidende: 1.) Eingabe: Du übergibst einen leeren String. 2.) Verarbeitung: Infolgedessen greift natürlich sofort
und die 3.) Ausgabe
kann nur ein ValueError sein.
Du musst also noch irgendwie sagen, dass Du erst dann mit der Verarbeitung beginnst, wenn Du mit der Eingabe fertig bist. Das kann man am besten mit einen Button machen.
Code: Alles auswählen
import Tkinter as Tk
class Main():
def __init__ (self):
self.root = Tk.Tk()
self.ausgabe=Tk.StringVar()
self.entry=Tk.Entry(self.root, width=10, background="yellow")
self.entry.pack()
self.button = Tk.Button(self.root, text='Berechnen', border='1',
relief='ridge', width=10, height=2,
command=self.pressbutton)
self.button.pack()
Label(self.root,
text='Ihr Ergebnis:',
width=10, height=3,
font=('Arial', 10), fg='black').pack()
Label(self.root,font=('Arial', 14), fg='red',
width=20, height=2,
textvariable=self.ausgabe).pack()
self.root.mainloop()
def pressbutton(self):
zahl = 10
user_input = self.entry.get()
rechnung = int(user_input)/zahl
ergebnis = (rechnung)
self.ausgabe.set(ergebnis)
main = Main()
Schnell mal ein wenig zusammen geschustert. - Nicht optimal, halt. Du solltest desweiteren von Sternchen *-Importen wegkommen. Auch wenn Du "from Tkinter import *" gar nicht gepostet hast, wissen wir, dass Du es verwendest. Das ist Böse.

Benutze einfach die Forumsuche, dann weist Du warum es so grauenvoll ist.
Gruß Andy
EDIT: Auch wenn andere schneller waren, wollte ich nicht mein Beispiel verwerfen.
Verfasst: Freitag 26. Oktober 2007, 20:15
von Ozim
entschuldigung... komm net weiter.
weder:
noch:
Code: Alles auswählen
lab4=Label(f3,text='Hypotenuse c = %0.2f'%c)
lab4.pack()
funktioniert um eine Variable in einen Text einzubauen der über Label ausgegeben wird

hat jemand eine idee?
sry wegen doppel-post
edit: Hab das post erst zu spät gesehen. ich setz mich gleich rann das zu probieren. thx...
Verfasst: Freitag 26. Oktober 2007, 20:25
von Andy
Ozim hat geschrieben:entschuldigung... komm net weiter.
edit: Hab das post erst zu spät gesehen. ich setz mich gleich rann das zu probieren. thx...
Ja, schau Dir mein post in Ruhe an. Und besonders, wie meine Ausgaben aussehen. Dann überlege, ob Du Deine Label-Ausgaben lieber anders ausgiebst.
Übrigens: Und bitte poste beim nächsten Problem ein bischen mehr Code. Wir können sonst immer nur Vermutungen anstellen...
Gruß Andy
Verfasst: Freitag 26. Oktober 2007, 20:33
von Ozim
Ok. nächstes mal kommt mehr code^^
ich poste ma kurz den Code wie er jetzt aussieht.
Code: Alles auswählen
import Tkinter as Tk
import tkMessageBox
from math import *
def Beenden():
sys.exit(0)
Fenster=Tk()
lab1=Label(Fenster,text="Dies ist ein Programm zur Berechnung der Groeßen a, b, c und h aus p und q")
lab1.pack()
def Start():
Fenster2=Tk()
f=Frame(Fenster2, relief='ridge', borderwidth=1)
f.pack()
lab2=Label(f,text="Bitte p eingeben:")
lab2.pack()
text1=Entry(f, width=10, background="yellow")
text1.pack()
f2=Frame(Fenster2, relief='ridge', borderwidth=1)
f2.pack()
lab3=Label(f,text="Bitte q eingeben:")
lab3.pack()
text2=Entry(f, width=10, background="yellow")
text2.pack()
k=text2.get()
l=text1.get()
if k!='':
p=int(k)
if l!='':
q=int(l)
c=p+q
h=sqrt(p*q)
a=sqrt(c*p)
b=sqrt(c*q)
def Berechnen():
Fenster3=Tk()
f3=Frame(Fenster3, relief='ridge', borderwidth=1)
f3.pack()
lab4=Label(f3,text='Hypotenuse c =',c)
lab4.pack()
lab5=Label(f3,text='Kathete a =',a)
lab5.pack()
lab6=Label(f3,text='Kathete b =',b)
lab6.pack()
lab7=Label(f3,text='Die Höhe h hat die Länge:',h)
lab7.pack()
but2=Button(Fenster2,text='Berechne!', command = Berechnen)
but2.pack()
but1=Button(Fenster,text='Start', command = Start)
but1.pack()
bende = Button(Fenster, text = "Exit", command = Beenden)
bende.pack()
Werd auf jedem fall morgen ma deinen code auseinander nehmen.
Aber ist es möglich die variable in den Label-Text einzubinden?
Gruß Ozim
Verfasst: Freitag 26. Oktober 2007, 20:42
von pyStyler
das hast du jetzt davon Andy!
Auf einen Fehler hinweisen und dann denjenigen in Stich lassen.

Verfasst: Freitag 26. Oktober 2007, 20:44
von Andy
pyStyler hat geschrieben:das hast du jetzt davon Andy!
Auf einen Fehler hinweisen und dann denjenigen in Stich lassen.

Wieso???? Ich bin doch noch da!!!!!

Hä

Verfasst: Freitag 26. Oktober 2007, 21:03
von Ozim
er hat mich ja net im stich gelassen

Verfasst: Freitag 26. Oktober 2007, 22:51
von Andy
Dir bringt es exakt gar nichts, wenn Du jetzt einfach nur die Import-Zeile austauscht. Dazu muss Dein Code anders aufgebaut sein. (Es fehlen die Tk.irgendwas-Angaben / siehe obigen Bsp.)
Ozim hat geschrieben:
Aber ist es möglich die variable in den Label-Text einzubinden?
Gruß Ozim
Meiner bescheidenen Meinung nach nicht.

Weil "text=" eine Option von Label ist. Da darf halt nur ein String rein. Und "c" wiederum ist keine Option von Label, was erklärt, warum es nicht funktioniert. Was hindert Dich daran, es so zu formulieren:
Code: Alles auswählen
ausgabe = IntVar()
if k!='':
p=int(k)
if l!='':
q=int(l)
c=p+q
def Berechnen():
Fenster3=Tk()
f3=Frame(Fenster3, relief='ridge', borderwidth=1)
f3.pack()
ausgabe.set(c)
lab4=Label(f3,text='Hypotenuse c =')
lab4.pack()
lab5=Label(f3, textvariable=ausgabe)
lab5.pack()
but2=Button(Fenster2,text='Berechne!', command = Berechnen)
but2.pack()
Mir gefällt der Aufbau sprich, die 3 Fenster nicht. Weißt Du was ein Toplevel ist? In Tkinter gibt es halt Parents-Widgets und Child-Widgets.
Ganz davon abgesehen ist es bedenklich, wenn Du 2 Wochen lang Kenntnisse in Python sammelst und dann zur GUI-Programmierung übergehst. Dann nämlich passiert folgendes: Es fehlen Grundlagen. Daher probiert man vorhandenen Code so umzuschreiben, dass man am Ende irgendwie so´n grafisches Ding genannt User-Interface raus bekommt. Kurz gesagt, gehe die ganzen Tutorials mit den Grundlagen durch. Danach arbeite Dich Schritt für Schritt in Tkinter ein. Und versuche es erstmal an einem Fenster. (Taschenrechner, Editor....) Alles nur Ratschläge, nicht persönlich nehmen.
@PyStyler Ja, ich weiß Du magst *-Importe. Trotzdem sind die Böse. Und wenn ich jemand hängen lassen müsste, dann würde ich es ihm sagen. Du weißt, ich bin selbst noch nicht lang dabei bzw. hab nicht die Zeit mich so intensiv mit dem programmieren zu beschäftigen wie andere.
Verfasst: Samstag 27. Oktober 2007, 10:24
von Ozim
Hi
Andy hat geschrieben: Was hindert Dich daran, es so zu formulieren:
Eigentlich nichts... nur das ich es wiedermal net richtig zum laufen bringe.
Aber das eigentliche Problem ist, dass ich gerade mal dein Beispiel von oben verstehen wollte, aber von Anfang an ein Fehler auftritt. Das mysteriöse ist, dass ich gestern den gleichen code getestet hab und er funktioniert hat
Und jetzt hab ich Python neuinstalliert und der Fehler bleibt der gleiche
Code: Alles auswählen
Traceback (most recent call last):
File "J:\Dokumente und Einstellungen\Klaus\Desktop\Python\test7.py", line 34, in <module>
main = Main()
File "J:\Dokumente und Einstellungen\Klaus\Desktop\Python\test7.py", line 16, in __init__
Label(self.root,
NameError: global name 'Label' is not defined
Jetzt sehe ich so aus:

und hoffe mir kann jemand helfen
Grüße Ozim
Verfasst: Samstag 27. Oktober 2007, 10:46
von schlangenbeschwörer
Andy hat geschrieben:
Dir bringt es exakt gar nichts, wenn Du jetzt einfach nur die Import-Zeile austauscht. Dazu muss Dein Code anders aufgebaut sein. (Es fehlen die Tk.irgendwas-Angaben / siehe obigen Bsp.)
Du kannst auf Label nur zugreifen, wenn du es importierst. Wenn du also am Anfang "from Tkinter import" + "Label" bzw. +"*" schreibst, was aber nicht gut ist. Wenn du jetzt "import Tkinter as tk" schreibst, muss du aber vor alle Tkinternamen ein "tk." schreiben

Verfasst: Samstag 27. Oktober 2007, 12:50
von HWK
Andy hat geschrieben:Meiner bescheidenen Meinung nach nicht.

Weil "text=" eine Option von Label ist. Da darf halt nur ein String rein. Und "c" wiederum ist keine Option von Label, was erklärt, warum es nicht funktioniert.
ist ja ein String. Nur Änderungen von c werden natürlich nicht automatisch im Label angepasst. Das muss dann von Hand erfolgen.
MfG
HWK
Verfasst: Samstag 27. Oktober 2007, 14:00
von Ozim
Also ich hab das gesamte prog neu geschrieben und es funktioniert!!! danke euch allen.
aber ich hab die ausgabe nun in einem Textfeld, was das das Ausgeben von Hypotenuse c = *Wert* vereinfacht.
Code: Alles auswählen
textfenster.insert(END, '\n' + 'Hypotenuse c = ')
textfenster.insert(END, c)
und dann klappt es.
mfg Ozim
Verfasst: Samstag 27. Oktober 2007, 14:37
von Andy
HWK hat geschrieben:ist ja ein String. Nur Änderungen von c werden natürlich nicht automatisch im Label angepasst. Das muss dann von Hand erfolgen.
MfG
HWK
Jo, dass hätte ich ihn besser gleich mit schreiben sollen. Da haste Recht.
Die vielen Tk´s erfüllen natürlich ihren Zweck. Hier ist es noch mal ganz gut beschrieben worden,
warum man *-Importe weglässt.
Wobei Du bleiben solltest, dass ist die Schreibweise in Deinem, wie auch in meinem Code von
z.B.
nur mit den Anführungszeichen kannst Du ohne den *-Import arbeiten.
Falsch:
Ozim hat geschrieben:aber ich hab die ausgabe nun in einem Textfeld, was das das Ausgeben von Hypotenuse c = *Wert* vereinfacht
Freut mich, dass Du noch eine andere Lösung gefunden hast. Wenn das für Deinen Programmablauf reicht.