Anfängerfrage

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.
Antworten
tomdest
User
Beiträge: 12
Registriert: Donnerstag 3. Januar 2008, 19:49

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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?
windner
User
Beiträge: 76
Registriert: Freitag 19. Oktober 2007, 11:25

Somit ist das Ergebnis auch immer ein int. Ist das so gewollt?
Andernfalls am Anfang einfach ein from __future__ import division.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

oder eben Teiler auf 10.0 setzen - das sollte reichen.
tomdest
User
Beiträge: 12
Registriert: Donnerstag 3. Januar 2008, 19:49

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
midan23
User
Beiträge: 147
Registriert: Sonntag 21. Mai 2006, 21:41
Wohnort: Müchen
Kontaktdaten:

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 ...)
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Mit der korrigierten Formel funktioniert alles super bei mir (Python 2.4.4 unter Linux).
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Unter Windows XP mit Python 2.5 ebenfalls.
BlackJack

@tomdest: Es "fehlen" die Variablen*deklarationen*, nicht die Definitionen.
tomdest
User
Beiträge: 12
Registriert: Donnerstag 3. Januar 2008, 19:49

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

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
tomdest
User
Beiträge: 12
Registriert: Donnerstag 3. Januar 2008, 19:49

Aha, ich dachte nur, da es a) das selbe Verhalten zeigt und b) in einem Minifenster die IDLE-Shell zeigt...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten