Text in Zahl formatieren

Fragen zu Tkinter.
Antworten
Ozim
User
Beiträge: 16
Registriert: Freitag 26. Oktober 2007, 19:00

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:

Code: Alles auswählen

    p=int(k) 
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. :oops:

Hoffe ihr könnt mir helfen,
Danke im vorraus Ozim
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Ozim
User
Beiträge: 16
Registriert: Freitag 26. Oktober 2007, 19:00

Ah danke.... :D

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!!! :D
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

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

Code: Alles auswählen

.get()
und die 3.) Ausgabe

Code: Alles auswählen

p=int(k)
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. :evil: Benutze einfach die Forumsuche, dann weist Du warum es so grauenvoll ist. :wink:

Gruß Andy
EDIT: Auch wenn andere schneller waren, wollte ich nicht mein Beispiel verwerfen.
Zuletzt geändert von Andy am Freitag 26. Oktober 2007, 20:16, insgesamt 1-mal geändert.
Ozim
User
Beiträge: 16
Registriert: Freitag 26. Oktober 2007, 19:00

entschuldigung... komm net weiter.

weder:

Code: Alles auswählen

 
lab4=Label(f3,text='Hypotenuse c =',c)
lab4.pack() 
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...
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

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
Ozim
User
Beiträge: 16
Registriert: Freitag 26. Oktober 2007, 19:00

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
Zuletzt geändert von Ozim am Freitag 26. Oktober 2007, 21:03, insgesamt 1-mal geändert.
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

das hast du jetzt davon Andy!
Auf einen Fehler hinweisen und dann denjenigen in Stich lassen. :D
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

pyStyler hat geschrieben:das hast du jetzt davon Andy!
Auf einen Fehler hinweisen und dann denjenigen in Stich lassen. :D


Wieso???? Ich bin doch noch da!!!!! :!::?:
Ozim
User
Beiträge: 16
Registriert: Freitag 26. Oktober 2007, 19:00

er hat mich ja net im stich gelassen ;)
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

Ozim hat geschrieben:

Code: Alles auswählen

 import Tkinter as Tk
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.
Ozim
User
Beiträge: 16
Registriert: Freitag 26. Oktober 2007, 19:00

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
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Andy hat geschrieben:
Ozim hat geschrieben:

Code: Alles auswählen

 import Tkinter as Tk
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 :!:
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

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.

Code: Alles auswählen

'Hypotenuse c = %0.2f' % c
ist ja ein String. Nur Änderungen von c werden natürlich nicht automatisch im Label angepasst. Das muss dann von Hand erfolgen.
MfG
HWK
Ozim
User
Beiträge: 16
Registriert: Freitag 26. Oktober 2007, 19:00

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
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

HWK hat geschrieben:

Code: Alles auswählen

'Hypotenuse c = %0.2f' % c
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.

Code: Alles auswählen

relief='ridge'
nur mit den Anführungszeichen kannst Du ohne den *-Import arbeiten.

Falsch:

Code: Alles auswählen

relief=RIDGE
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.
Antworten