Seite 1 von 1

Anfängerfrage

Verfasst: Donnerstag 3. Januar 2008, 19:59
von tomdest
Hallo Forum ;D

ich arbeite mich gerade in Python ein und habe zwei komische Artefakte bei folgendem Grafik-Rumspiel-Skript:

Code: Alles auswählen

# -*- coding: cp1252 -*-

from Tkinter import *
from math import *

xAnfang=20
yAnfang=200
Versatz=3
Amplitude=2
Groesse=50
Teiler=10
def GrafikZeichnen():
    for i in range(100):
        x1=xAnfang+i*Versatz
        x2=x1+Groesse
        y1=yAnfang+i*Versatz*sin(i/Teiler)*Amplitude
        print i, sin(i/Teiler), y1
        y2=y1+Groesse
        cnvGrafik.create_oval(x1,y1,x2,y2)

Haupt=Tk()                                                             

#Haupt-Frame erzeugen und setzen // bei .pack() funktioniert wegen .grid unten das .quit nicht!
Fenster=Frame(Haupt)
Fenster.grid()

# die Widgets
# # Zeichenflaeche
cnvGrafik=Canvas(Fenster, width=500, height=500, background='white')     
# # Schalter "Start"
btnStart=Button(Fenster, text="Start", command=GrafikZeichnen)                                   
# # Schalter "Ende"
btnEnde=Button(Fenster, text="Ende", command=Fenster.quit)                                     

# Setzen der Komponenten mittels Gridmanager
cnvGrafik.grid(row=0, column=0, columnspan=5, sticky=W)                  
btnStart.grid(row=1, column=1, sticky=S)
btnEnde.grid(row=1, column=3, sticky=S)

# Hauptschleife
Haupt.mainloop()
(Kommentare sind für mich gedacht)

Zu den zwei Artefakten:

1.) Drücke ich auf "Ende", sehe ich an der Shell, dass das Programm beendet wird; das Fenster verschwindet aber nicht - irgendwann (nach hektischem Geklicke auf das Kreuz) kommt "Das Programm reagiert nicht...". - mit "Sofort beenden" verschwindet es dann. Warum das denn?
2.) Ich würde eigentlich eine sinusförmige Kurve von Kreisen erwarten, stattdessen kommt eine völlig abgedrehte Grafik (probiert's mal aus); habe ich ein Variablen-Problem (float vs. integer)?

Ich benutze Python 2.5 auf WinXP mit IDLE.

Vielen Dank im Voraus,


tomdest

Verfasst: Donnerstag 3. Januar 2008, 20:26
von Hyperion
Also das wird sicher nicht so laufen wie Du Dir das denkst!

Code: Alles auswählen

y1=yAnfang+i*Versatz*sin(i/Teiler)*Amplitude 
Das solltest Du aber auch in der Ausgabe sehen ... *wunder* i und teiler sind ja beide Integer. Somit ist das Ergebnis auch immer ein int. Ist das so gewollt?

Verfasst: Donnerstag 3. Januar 2008, 21:08
von windner
Somit ist das Ergebnis auch immer ein int. Ist das so gewollt?
Andernfalls am Anfang einfach ein from __future__ import division.

Verfasst: Donnerstag 3. Januar 2008, 21:49
von Hyperion
oder eben Teiler auf 10.0 setzen - das sollte reichen.

Verfasst: Freitag 4. Januar 2008, 08:37
von tomdest
Hallo,

herzlichen Dank, ich hab's kapiert (fehlende Variablendefinitionen sind noch etwas fremd für mich, ich bin da Delphi gewohnt); mit einer kleinen Änderung der Formel sieht es nun wie erwartet aus:

Code: Alles auswählen

...
Teiler=10.0
def GrafikZeichnen():
    for i in range(100):
        x1=xAnfang+i*Versatz
        x2=x1+Groesse
        y1=yAnfang+sin(i/Teiler)*Amplitude
        #print i, sin(i/Teiler), y1
        y2=y1+Groesse
        cnvGrafik.create_oval(x1,y1,x2,y2)
...
Jetzt ist nur noch die Frage wegen des "Ende"-Buttons - XP-Bug?

Viele Grüße, herzlichen Dank,


tomdest

Verfasst: Freitag 4. Januar 2008, 08:53
von midan23
Kann es sein, das du dein Programm aus IDLE heraus startest ?

Wenn ja, versuchs mal ohne IDLE ...

(Ich glaube mich errinern zu können, das es da Probleme gibt ...)

Verfasst: Freitag 4. Januar 2008, 09:33
von Rebecca
Mit der korrigierten Formel funktioniert alles super bei mir (Python 2.4.4 unter Linux).

Verfasst: Freitag 4. Januar 2008, 09:53
von Zap
Unter Windows XP mit Python 2.5 ebenfalls.

Verfasst: Freitag 4. Januar 2008, 11:09
von BlackJack
@tomdest: Es "fehlen" die Variablen*deklarationen*, nicht die Definitionen.

Verfasst: Freitag 4. Januar 2008, 12:08
von tomdest
Hallo,

jetzt ist alles klar, herzlichen Dank!

@BlackJack: Natürlich richtig von Dir: Deklarationen, sorry!
@midan23: Jap, das war es; und da auch WingIDE über IDLE geht, funktioniert es da auch nicht; direkt aufgerufen => passt!

Viele Grüße,


tomdest

Verfasst: Freitag 4. Januar 2008, 15:37
von Leonidas
tomdest hat geschrieben:und da auch WingIDE über IDLE geht
Nein. WingIDE ist von der IDLE unabhängig. Du kannst WingIDE ohne IDLE installiert zu haben nutzen.

Verfasst: Freitag 4. Januar 2008, 17:03
von tomdest
Aha, ich dachte nur, da es a) das selbe Verhalten zeigt und b) in einem Minifenster die IDLE-Shell zeigt...

Verfasst: Freitag 4. Januar 2008, 17:11
von Leonidas
tomdest hat geschrieben:Aha, ich dachte nur, da es a) das selbe Verhalten zeigt und b) in einem Minifenster die IDLE-Shell zeigt...
a) es startet wohl Programme auf eine ähnliche Weise wie IDLE, die eben zu Problemen führt b) ist das nicht die IDLE-Shell, sondern der Python-Interpreter. Das ist sein Interface, welches die IDLE, WingIDE und alle anderen IDEs auch einbinden. Aber den Interpreter bekommst du auch ohne IDE.