Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    42

    [Python] ritardare l'esecuzione di un ciclo

    Ciao a tutti, ho un problema un pò singolare con Python. Devo fare in modo che una funzione venga iterata un tot. di volte, in modo però che ogni esecuzione sia ritardata di un tot. di millisecondi rispetto alla precedente. Fra le varie soluzioni che ho provato questa mi pare quella che si avvicina di più a quello che voglio io:

    from Tkinter import *

    def run():
    [...]

    pos=0
    while pos<=30:
    top.after(10,func=run)
    pos=pos+1
    "top" è una finestra toplevel creata con Tkinter, e "after" è la funzione che ritarda l'esecuzione di un comando (nel mio caso la funzione run) di un tot. di millesecondi (è simile a time.sleep). "run" è la funzione di cui dev'essere ritardata l'esecuzione. Questo metodo però non funziona, perché l'istruzione after non blocca l'esecuzione del while: mi serve qualcosa che ne blocchi temporaneamente l'esecuzione.

    Così, ho provato a fare questo:

    from Tkinter import *

    def go():
    global start
    start=0

    start=1
    top=Tk()
    top.after(1000,func=go)
    while 1:
    if start==0:
    break
    Nella mia idea, il "while 1:" dovrebbe creare un loop e, in teoria, dopo 1000 msec, il valore di start dovrebbe diventare 0 e il while verrebbe bloccato. In pratica non è così, perché sembra che l'istruzione after non venga affatto eseguita a causa del loop.

    Non so se son riuscito a rendere l'idea...

    Avevo già creato questa funzione in Tcl/Tk, e lì usavo l'istruzione vwait, che in Tkinter sembra non esserci (ma spero di sbagliarmi).

    Qualcuno ha qualche suggerimento?

  2. #2
    Non ho capito il tuo problema ma visto che non puoi usare time.sleep() tieni in considerazione threading.Timer():

    codice:
    from threading import Timer
    
    def hello():
        print "hello, world"
    
    t = Timer(30.0, hello)
    t.start() # after 30 seconds, "hello, world" will be printed
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    42
    Grazie per il suggerimento, ma ho provato e non va ancora bene... provo a spiegare da principio quello che devo fare. Devo creare una finestra a sfondo nero che rappresenta un pallino rosso. Questo pallino deve muoversi, compiendo un tragitto che va da un'estremità all'altra della finestra (si deve muovere da sinistra a destra).

    Per creare la finestra e il pallino uso il seguente codice:

    codice:
    from Tkinter import *
    
    top=Tk()
    top.geometry("500x500")
    can=Canvas(top,width=500,height=500,background="black")
    can.pack()
    span=10
    x1=5
    y1=50
    x2=x1+span
    y2=y1+span
    can.create_oval(x1,y1,x2,y2,fill="red",outline="red")
    A questo punto, ho bisogno che il pallino si muova. Dato che il pallino è rosso e lo sfondo è nero, non faccio altro che colorare di nero il pallino (che quindi sparisce), aumentrae x1 e x2 e creare un nuovo pallino rosso accanto al vecchio, ma con le nuove coordinate: in questo modo, sembrerà che il pallino si muova. Ecco il codice che avevo intenzione di usare:

    codice:
    pos=0
    
    def run():
      global x1,x2,start
      can.create_oval(x1,y1,x2,y2,fill="black",outline="black")
      x1=x1+span+1
      x2=x2+span+1
      can.create_oval(x1,y1,x2,y2,fill="red",outline="red")
    
    while pos<=30:
      top.after(500,func=run)
      Timer(10,run)
      pos=pos+1
    Perché ciò funzioni, è necessario che ogni ciclo while, una volta interpretata l'istruzione top.after, si blocchi per 500 millisecondi. Dopo questo lasso di tempo, la funzione "run" aggiornerà la posizione del pallino, e il while dovrebbe riprendere a ciclare e lanciare nuovamente, dopo 500 msec, l'istruzione run, che aggiornerà nuovamente la posizione del pallino... e questo sinchè la variabile pos sarà minore o uguale a 30.

    Il codice non funziona perchè nè after nè time.sleep sono in grado di bloccare per un determinato lasso di tempo il ciclo while. In Tcl/Tk questo era possibile grazie all'istruzione vwait.

    Quello che sto realizzando è un esperimento di psicofisica, e in Phyton ci sono già librerie dedicate (psychopy e VisionEgg), che tra l'altro sono molto belle, ma purtroppo il movimento del pallino, fatto con le funzioni di questi pacchetti, non è come lo voglio io. In Tcl/Tk invece il movimento che riuscivo a ottenere era molto bello, ma purtroppo nè il while nè il for erano in grado ciclare a velocità costante: ne risultava che la velocità del pallino non era costante (una cosa impercettibile all'occhio umano, ma per me fondamentale!).

  4. #4
    Ho provato a eseguire il codice che hai incollato ma non fa nulla.
    Non ho mai utilizzato le Tk ma prova a incollare il codice completo funzionante (per funzionante intendo che faccia almeno qualcosa senza sollevare eccezioni).
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    42
    Scusa, c'era una riga in più, questa:
    codice:
      Timer(10,run)
    Dovuta al fatto che stavo provando l'istruzione che mi avevi suggerito!
    Eliminata questa riga, il codice va. Ma almeno la finestra col pallino ti compare? Perché a me funziona, almeno la prima parte; quando invio la seconda parte, una volta che il while viene eseguito il pallino rosso si sposta dall'estema sinistra all'estrema destra, ma lo fa così velocemente (il ciclo while è velocissimo) che non percepisco il movimento ma solo un pallino che scompare da sinsitra e ricompare a destra.

  6. #6
    Non va, cicla fino a 30 e poi esce, senza che compaia nulla.
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    42
    Proprio non capisco. Scusa se scrivo banalità, ma ecco quello che faccio io: apro il terminale (sono su Linux) e digito
    codice:
    python
    Poi copio il seguente codice:
    codice:
    from Tkinter import *
    
    top=Tk()
    top.geometry("500x500")
    can=Canvas(top,width=500,height=500,background="black")
    can.pack()
    span=10
    x1=5
    y1=50
    x2=x1+span
    y2=y1+span
    can.create_oval(x1,y1,x2,y2,fill="red",outline="red")
    E lo incollo sul terminale. Mi compare una finestra nera con un pallino rosso sulla sinistra... a te non succede? Forse è perché io sono su Linux?

  8. #8
    Sono su Windows e non succede.
    Non ho una macchina Linux con installato l'ambiente grafico quindi non posso provare.

    Forse è perché io sono su Linux?
    Non dovrebbe fare alcuna differenza.
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

  9. #9
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    42
    Già, sono entrato su Windows e non fa alcuna differenza... a me funziona! Non riesco a spiegarmi questa cosa. Ma a te il codice dà errore o viene compilato senza avere alcun effetto?

  10. #10
    Non da nessun errore.
    Viene eseguito e termina, ma non compare nulla.
    Purtroppo, ripeto, di Tk non so nulla, quindi non saprei neanche come "lavorare" su questo problema.
    Dall'alto della mia ignoranza posso azzardare a dire che forse non fa nulla perchè manca l'istruzione che lancia il loop infinito di Tk.
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.