Syntax Error

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
digi
User
Beiträge: 7
Registriert: Freitag 22. August 2008, 20:15
Wohnort: bei Göttingen
Kontaktdaten:

Syntax Error

Beitragvon digi » Freitag 22. August 2008, 20:34

Hi,

ich bin dabei mein erstes Programm in Pyton zu basteln.
Vorher habe ich nur in PHP und Gambas rumgemacht :)

In Zeile 6 bekomme ich einen Syntax Error

hier das ganze Programm

Code: Alles auswählen

from Tkinter import *

def rechne():
    anzStabe = eingabe_g.get() / (eingabe_max.get() + eingabe_s.get() )
    dickegesamt = eingabe_g.get() - (anzStabe * eingabe_s.get() )
    abstand = dickegesamt / (anzStabe + 1)
    abstand = Round(abstand, -1)
    lab_a2=Label(root,text=abstand)

root = Tk()
root.title('Digi´s Abstandsrechner')

c = Canvas(root, width="376",height="160")
c.pack()
bild = PhotoImage(file="/home/dirk/Projekte/Gambas/stabkalk/bild1.gif")
c.create_image(0, 0, anchor=NW, image=bild)

lab_s=Label(root,text="Sabstaerke S")
lab_s.place(x=3,y=170)
eingabe_s=Entry(root,width=5)
eingabe_s.place(x=91,y=170)
lab_s2=Label(root,text="mm")
lab_s2.place(x=136,y=170)

lab_g=Label(root,text="Innenmaß Rahmen G")
lab_g.place(x=166,y=170)
eingabe_g=Entry(root,width=6)
eingabe_g.place(x=297,y=170)
lab_s3=Label(root,text="mm")
lab_s3.place(x=350,y=170)

lab_max=Label(root,text="Abstand A darf maximal")
lab_max.place(x=10,y=210)
eingabe_max=Entry(root,width=5)
eingabe_max.place(x=160,y=210)
lab_max2=Label(root,text="mm betragen")
lab_max2.place(x=204,y=210)

lab_a=Label(root,text="Abstand A betraegt")
lab_a.place(x=100,y=250)
lab_a2=Label(root,text="")
lab_a2.place(x=220,y=250)

but=Button(root,text="Stababstaende ausrechnen",command=rechne)
but.place(x=100,y=270)

root.mainloop()


mfg Dirk
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Beitragvon BlackVivi » Freitag 22. August 2008, 20:36

Schau dir mal die Einrückung an.
Benutzeravatar
Area51
User
Beiträge: 27
Registriert: Donnerstag 24. Juli 2008, 11:38
Wohnort: Heidelberg
Kontaktdaten:

Beitragvon Area51 » Freitag 22. August 2008, 20:38

Ab Zeile 6 ist die Einrückung um ein Leerzeichen verschoben.
Nachdem ich die überflüssigen Leerzeichen gelöscht habe, hat es bei mir funktioniert.

// EDIT:
Argh, Vivi war schneller.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Freitag 22. August 2008, 21:09

Area51 hat geschrieben:Ab Zeile 6 ist die Einrückung um ein Leerzeichen verschoben.
Nachdem ich die überflüssigen Leerzeichen gelöscht habe, hat es bei mir funktioniert.


Was heißt "funktioniert" ... das Programm läuft vielleicht, funktionieren tut es aber sicher nicht. Beim Berechnen werden Zeichenketten aus den Entry-Feldern gelesen und anschließend addiert (na gut, das wäre noch was geworden), dividiert und gerundet ... :cry:
BlackJack

Beitragvon BlackJack » Freitag 22. August 2008, 21:22

Gerundet? Also ich sehe da nur einen `NameError`. :P
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Freitag 22. August 2008, 21:31

Ups, glatt übersehen ...
Benutzeravatar
digi
User
Beiträge: 7
Registriert: Freitag 22. August 2008, 20:15
Wohnort: bei Göttingen
Kontaktdaten:

Beitragvon digi » Samstag 23. August 2008, 08:00

Hi,
danke für eure Hilfe. Das mit der Funktion und dem Lehrzeichen habe ich noch nicht gerefft :(

Woher weis Python denn das die Funktion zuende ist ?

Hier mal das Script so wie es mei mir läuft

Code: Alles auswählen

from Tkinter import *

def rechne():
 anzStabe = int(eingabe_g.get()) / (int(eingabe_max.get()) + int(eingabe_s.get()) )
 dickegesamt = int(eingabe_g.get()) - (anzStabe * int(eingabe_s.get()) )
 abstand = dickegesamt / (anzStabe + 1)
 abstand = round(abstand, 0)
 lab_a2.config(text=str(abstand)+"mm bei "+str(anzStabe)+" Staeben")

root = Tk()
root.title('Digi´s Abstandsrechner')

c = Canvas(root, width="376",height="160")
c.pack()
bild = PhotoImage(file="/home/dirk/Projekte/Gambas/stabkalk/bild1.gif")
c.create_image(0, 0, anchor=NW, image=bild)

lab_s=Label(root,text="Sabstaerke S")
lab_s.place(x=3,y=170)
eingabe_s=Entry(root,width=5)
eingabe_s.place(x=91,y=170)
lab_s2=Label(root,text="mm")
lab_s2.place(x=136,y=170)

lab_g=Label(root,text="Innenmaß Rahmen G")
lab_g.place(x=166,y=170)
eingabe_g=Entry(root,width=6)
eingabe_g.place(x=297,y=170)
lab_s3=Label(root,text="mm")
lab_s3.place(x=350,y=170)

lab_max=Label(root,text="Abstand A darf maximal")
lab_max.place(x=10,y=210)
eingabe_max=Entry(root,width=5)
eingabe_max.place(x=160,y=210)
lab_max2=Label(root,text="mm betragen")
lab_max2.place(x=204,y=210)

lab_a=Label(root,text="Abstand A betraegt")
lab_a.place(x=100,y=250)
lab_a2=Label(root,text="")
lab_a2.place(x=220,y=250)

but=Button(root,text="Stababstaende ausrechnen",command=rechne)
but.place(x=100,y=270)

root.mainloop()


Nun habe ich noch zwei schöhnheitsfehler.

1. nach dem Starten des Programms mus ich das Fenster in der Höhe vergrößern um die Eingabefelder zu sehen.

2. Die Ausgabe des ergebnisses ist blöd. Die Zeile müste automatisch nach links gerückt werden wenn die Zahlen größer werden.

mfg Dirk

PS Hier das Bild zum Programm:

Bild
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Samstag 23. August 2008, 08:26

digi hat geschrieben:Das mit der Funktion und dem Lehrzeichen habe ich noch nicht gerefft :(
Woher weis Python denn das die Funktion zuende ist ?


Deine Fragen zeigen deutlich an, dass du mal ganz vorne mit Python anfangen solltest. Ein guter Einstiegspunkt wäre das offizielle Tutorial:
http://docs.python.org/tut/tut.html
Oder - in etwas älterer Fassung - auf Deutsch:
http://starship.python.net/crew/gherman/publications/tut-de/online/tut/

Falls dir das Englische nicht so liegt, hier was Deutsches (aber alles nicht so gut wie das Tutorial oben):
http://www.wspiegel.de/pykurs/kurs_index.htm
http://ada.rg16.asn-wien.ac.at/~python/how2think/
http://www.way2python.de/

Das Arbeiten mit Tkinter würde ich erst einmal zurückstellen, bis du die Grundlagen von Python selbst verstanden hast. Tkinter ist nämlich eine Sache für sich und um es wirklich gut zu nutzen, sollte man die Grundlagen der objektorientierten Programmierung (mit Python) verstanden haben.


digi hat geschrieben:1. nach dem Starten des Programms mus ich das Fenster in der Höhe vergrößern um die Eingabefelder zu sehen.
2. Die Ausgabe des ergebnisses ist blöd. Die Zeile müste automatisch nach links gerückt werden wenn die Zahlen größer werden.


Ist beides lösbar durch Basteln am Code. Ist aber nicht der richtige Weg:
Den place()-Geometriemanager solltest du vergessen. Damit gewöhnst du dir die falsche Herangehensweise beim Aufbau einer GUI an.

Nachdem du dich in Python eingearbeitet hast, wäre die Beschäftigung mit Tkinter der richtige Weg. Gut für den Anfang ist:
http://www.ferg.org/thinking_in_tkinter/all_programs.html

Falls es dir die Sache wert ist, könnte sich auch die Anschaffung des Buches von Michael Weigend: Objektorientierte Programmierung mit Python lohnen. Da bekommt man nicht nur einen sanften Einstieg in Python und OOP, sondern auch gut 100 Seiten über Tkinter.
BlackJack

Beitragvon BlackJack » Samstag 23. August 2008, 09:43

@digi: Das Programm hat noch mehr Schönheitsfehler.

Der Sternchen-Import von `Tkinter`.

Kein "Coding"-Kommentar trotz Zeichen ausserhalb von ASCII im Quelltext, was ab Python 2.5 ein Syntaxfehler ist!

Kommunikation über globale Namen, das gehört in eine Klasse.

Keine Überprüfung der Benutzereingabe bzw. keine Reaktion auf falsche Eingaben.

Die Inhalte der Eingabefelder werden unnötigerweise zu oft aus den Widgets gelesen und umgewandelt.

Zeichenkettenformatierung mittels ``%``-Operator ist IMHO übersichtlicher als `str()` und ``+``.

Sich wiederholender ähnlicher Quelltext sollte in eine Funktion oder Methode verpackt werden und mit den "Unterschieden" als Argumenten aufgerufen werden. Das betrifft mindestens die drei Eingabefelder, wo sich der Quelltext eigentlich nur durch die Texte und die Positionen beim `place()` unterscheidet. Wenn man, wie numerix schon vorgeschlagen hat, einen vernünftigen Geometriemanager verwendet, fallen die Positionen weg.

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]