Avatar
Inoue Yūki
Redaktor
Avatar
Inoue Yūki:

Zdravím,
chtěl bych se zeptat, jak byste teoreticky řešili postup při animaci textu s efektem psacího stroje v PyGame? Každé písmeno by se napsalo za určitý čas. Ze zoufalosti jsem zkoušel wait(), ale to čekala celá aplikace, což nechci.

Předem děkuju za odpověď. :)

Odpovědět 14.12.2014 15:17
Avatar
hanpari
Redaktor
Avatar
Odpovídá na Inoue Yūki
hanpari:

Zkus tenhle modul:
https://docs.python.org/…y/sched.html

Nedávno jsem na něj narazil a myslím, že by ti mohl pomoc. :)
Hned ten první příklad je myslím to co potřebuješ :)

 
Nahoru Odpovědět 14.12.2014 16:49
Avatar
Inoue Yūki
Redaktor
Avatar
Odpovídá na hanpari
Inoue Yūki:

Asi jsem nepochopil, k čemu daný modul vlastně slouží. Můžeš napsat příklad?

Nahoru Odpovědět 14.12.2014 17:55
Avatar
hanpari
Redaktor
Avatar
Odpovídá na Inoue Yūki
hanpari:

Zkus tohle. Je to napsané jen tak na rychlo, ale myšlenka snad je dost jasná :)

import sched, time
from threading import Thread

s = sched.scheduler(time.time, time.sleep)
text = list(reversed("Tohle je text"))

def vypis():
    print(text.pop())

for i in range(len(text)):
    s.enter(i,1,vypis)

t = Thread(target=s.run)
t.start()
time.sleep(1)
print("Něco jiného")
time.sleep(2)
print("Něco jiného2")
 
Nahoru Odpovědět 14.12.2014 18:46
Avatar
hanpari
Redaktor
Avatar
Odpovídá na Inoue Yūki
hanpari:

Jinak se omlouvám, to co jsi zřejmě potřeboval, byl modul threading. Modul sched je v tomhle případě jako jít s kanónem na vrabce :)

Takhle je to jednodušší:

from time import sleep
from threading import Thread
def vypis():
    for c in "Text k vypsaní.":
        print(c)
        sleep(1)


Thread(target=vypis).start()

print("Hlavní vlákno.")
sleep(2)
print("Tady můžeš pokračovat dál...")
sleep(1)
print("A tak dále...")
 
Nahoru Odpovědět 14.12.2014 20:26
Avatar
gcx11
Redaktor
Avatar
Odpovídá na Inoue Yūki
gcx11:

A co zkusit ohandlovat vypisování v nekonečném cyklu programu? Např. za pomoci modulu time?

 
Nahoru Odpovědět 14.12.2014 21:49
Avatar
coells
Redaktor
Avatar
Odpovídá na Inoue Yūki
coells:

Teoretických řešení je více, ale praktické řešení a jediné správné je využít frontu událostí (event queue).

Udělej následující:

  1. přes http://www.pygame.org/…ef/time.html#… si nastav opakovanou událost
  2. událost bude USEREVENT+x a v mai loop na ni budeš reagovat vlastním handlerem
  3. když událost nebude potřeba, nastav timer na 0 a zakaž ji

Koukám se na dokumentaci a PyGame má podivně řešený event loop - nebo spíš hodně primitivně. Dokumentace, bohužel, neuvádí, jestli je časovač reentrantní, takže se může stát, že se bude událost objevovat ve frontě příliš často a dojde k tzv. throttlingu. Ale vzhledem k tomu, že mnohem horší problémy bude mít už samotný main loop, asi to bude to poslední, co by tě zajímalo.

 
Nahoru Odpovědět  +1 14.12.2014 22:54
Avatar
hanpari
Redaktor
Avatar
Odpovídá na coells
hanpari:

Mimochodem, myslíš že by byl nějaký problém to spáchat přes ta vlákna? Klidně se rozepiš, když budeš mít čas, tahle problematika je zajímavá.

 
Nahoru Odpovědět 15.12.2014 6:45
Avatar
coells
Redaktor
Avatar
Odpovídá na hanpari
coells:

Kdykoliv se objeví vlákna, je to vždy velký problém. Práce s vlákny spadá do kategorie SLOŽITÉ a pokud se objeví v kódu, stává se vývoj složitějším o několik řádů.

 
Nahoru Odpovědět 15.12.2014 16:00
Avatar
hanpari
Redaktor
Avatar
Odpovídá na coells
hanpari:

Jen takový dotaz. Neřeší v pythonu tyhle problémy s vlákny právě GIL? Nebo to platí obecně?

 
Nahoru Odpovědět 16.12.2014 13:24
Avatar
coells
Redaktor
Avatar
Odpovídá na hanpari
coells:

Platí to obecně. GIL pouze zajišťuje sekvenční provádění bytecodu.

 
Nahoru Odpovědět  +1 16.12.2014 15:30
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.