Reaktionstest

Code-Stücke können hier veröffentlicht werden.
Antworten
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

Hallo!

ich habe vorhin als Python-Neuling ein simples Programm geschrieben.

Das ganze läuft so ab:
Es gibt einen Button, auf den geklickt werden kann.
Dann erscheint in einem Canvas ein grünes Quadrat.
Sobald man in dieses Quadrat mit der Maus reingeht,
dauert es eine unbestimmte Zeit, bis ein zweites Quadrat an zufälliger Stelle erscheint.
Der Anwender soll so schnell wie möglich mit der Maus in das zweite Kästchen gehen.
Sobald er ankommt, erscheint unten angezeigt wie lange er gebraucht hat.

So weit, so gut, ABER!!

Folgendes Problem:
wenn der Anwender ein zweites mal in das Quadrat geht, so erscheint eine neue Zeit.
Ich hab das versucht mit .unbind zu vermeiden, jedoch erfolglos.

Hoffe das wahr verständlich

Hier kommt das programm

Code: Alles auswählen

# -*- coding: cp1252 -*-
#reaktionstest.py


import time, random
from Tkinter import *




def found(e):
    stopp=time.clock()
    dauer=stopp-beginn
    ausgabe.config(text = 'Du hast %f Sekunden gebraucht.' %dauer)
    ausgabe.pack()
    canvas.unbind('feld')

    
def starten2(e):
    canvas.unbind('startfeld')
    global beginn
    xa = random.uniform(15,270)
    ya = random.uniform(15, 270)
    xz= xa+10
    yz = ya+10                                #koordinaten 
    time.sleep(random.random()*10)  #warten für 1-10 sec.
    global feld
    feld=canvas.create_rectangle(xa, ya, xz, yz, fill = 'red', tags = 'feld')
    beginn=time.clock()
    canvas.tag_bind(feld, '<Enter>',  found)

def starten1(e):
    global startfeld
    startfeld=canvas.create_rectangle(140, 140, 160, 160, fill = 'green', tags= 'startfeld')
    canvas.tag_bind(startfeld, '<Enter>',  starten2)
    
    

root=Tk()
root.title('Reaktionstest')
root.minsize(450, 450)

ueberschrift=Label(root, text = 'Reaktionstest',\
                     fg = '#800000' , font="\"Eurostile\" 23") 
ueberschrift.pack()

beschreibung=Label(root, text='Beschreibung: \nKlick auf "Start Test".'+\
                   'Es erscheint ein grünes Feld. Gehe mit dem Mauszeiger in dieses Feld'+\
                   '\nBleibe mit dem Curser solange in dem grünen Feld bis ein neues Feld erscheint'+\
                   '\nVersuch so schnell wie möglich mit der Maus in das neue Feld zu kommen')
beschreibung.pack()

start=Button(root, text= 'Start Test')
start.pack()
Widget.bind(start, '<Button-1>', starten1)

canvas = Canvas(root, relief = SUNKEN, border = 4, width = 300, height = 300,\
                background = "white")
canvas.pack()

ausgabe=Label(root, text = ' ')
ausgabe.pack()

                   
jaa, ich weiß dass das ganze noch potenzial zum ausbauen hat (und vorallem erstmal richtig zum Laufen gebracht werden muss )
Es gibt noch einige schwachstellen^^

Freue mich über jede Anregung, aber bitte nicht zu komplieziert^^
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ich rate mal: statt "unbind" vielleicht "tag_unbind" benutzen?

Dann gleich noch ein paar Anmerkungen hinterher:
- mache keine *-Importe
- um die Gleichheitszeichen bei der Zuweisung der Schlüsselwortparameter gehören keine Leerzeichen
- um die anderen Gleichheitszeichen gehören Leerzeichen (wirf mal einen Blick auf PEP8)
- vergiss das es "global" überhaupt gibt, mit einer einfachen Klasse kannst du das umgehen
- du solltest keinen Code auf Modulebene schreiben, da dieser beim Importieren sofort ausgeführt wird; verfrachte den Code also in eine main-Funktion welche du dann so aufrufen kannst:

Code: Alles auswählen

if __name__ == "__main__":
    main()
dann kannst du deine Module auch wiederverwenden
- benutze Konstanten und schreibe nicht alle möglichen Werte direkt in den Code; Anpassungen werden sonst viel zu schwierig, da du dir alles noch einmal anschauen musst.
- mehrzeilige Strings kannst du einfacher erstellen:

Code: Alles auswählen

"""ich
habe
mehrere
zeilen"""
- wenn du Widgets nie wieder benutzt, musst du sie an keinen Namen binden, du kannst dann auch direkt bei der Erzeugung "pack" aufrufen
- auch "stopp" benötigst du nicht, da kannst du gleich "dauer = time.clock() - beginn" schreiben
- deine Funktionsnamen sind total unbrauchbar, "starten1" und "starten2" sagen nichts über die Funktionalität aus
- "found" kannst du auch einen deutschen Namen geben, da eh alles in deutsch bezeichnet ist


Das waren jetzt ein paar Anregungen und auch alle nicht kompliziert ;-)
Das Leben ist wie ein Tennisball.
Antworten