Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Animace textu

Aktivity
Avatar
Neaktivní uživatel:14.12.2014 15:17

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
Neaktivní uživatelský účet
Avatar
hanpari
Člen
Avatar
Odpovídá na Neaktivní uživatel
hanpari:14.12.2014 16:49

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
Odpovídá na hanpari
Neaktivní uživatel:14.12.2014 17:55

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

Nahoru Odpovědět
14.12.2014 17:55
Neaktivní uživatelský účet
Avatar
hanpari
Člen
Avatar
Odpovídá na Neaktivní uživatel
hanpari:14.12.2014 18:46

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
Člen
Avatar
Odpovídá na Neaktivní uživatel
hanpari:14.12.2014 20:26

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
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
gcx11:14.12.2014 21:49

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
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
coells:14.12.2014 22:54

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
14.12.2014 22:54
Avatar
hanpari
Člen
Avatar
Odpovídá na coells
hanpari:15.12.2014 6:45

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
Tvůrce
Avatar
Odpovídá na hanpari
coells:15.12.2014 16:00

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
Člen
Avatar
Odpovídá na coells
hanpari:16.12.2014 13:24

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
Tvůrce
Avatar
Odpovídá na hanpari
coells:16.12.2014 15:30

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

 
Nahoru Odpovědět
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.