Portál AbcLinuxu, 13. května 2025 23:40

Dotaz: Python + Gtk + sleep

7.8.2011 11:28 Petur
Python + Gtk + sleep
Přečteno: 217×
Odpovědět | Admin
Zdravím,

mám malý problém a rád bych si nechal poradit.

Psal jsem si malý prográmek v pythonu s Gtk a když chci provést něco takového:

      for i in range (1,10): 
        self.entry.set_text(str(i))
        time.sleep(1)
    

tak se mi to Gtk UI nezastavuje po jedné vteřině, ale vždy na celou dobu cyklu. Když si to nechám vypsat v terminálu, tak se to zastaví vždy na jednu vteřinu a vypíše, Gtk se zastaví na celou dobu a nakonec vypíše poslední hodnotu.

Nevíte někdo, co s tím? Jak by se to dalo napsat tak, aby se zastavovalo po jedné vteřině i to Gtk?

Jsem vděčný za jakékoliv rady a nápady.

Taky jsem uvažoval, jestli to je tím sleep(1) nebo celým cyklem for, skoro jako by to Gtk čekalo, až cyklus skončí, aby mohlo něco zobrazit..
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

7.8.2011 12:50 l4m4
Rozbalit Rozbalit vše Re: Python + Gtk + sleep
Odpovědět | | Sbalit | Link | Blokovat | Admin
Teď ti prostě v rámci hlavní smyčky Gtk+ proběhne věc, která tvrá 10 sekund, tedy celý ten cyklus. Během této doby se přirozeně nezpracují žádné jiné události ani se nic nevykreslí (ne, Entry.set_text() se do hlavní smyčky nevrátí, jen změní ten text). Pak se to konečně do hlavní smyčky vrátí a vykreslí finální hodnotu v té entry.

Co přesně znamená zastavovalo po jedné sekundě Gtk+? Má po tom čase proběhnout jedna iterace hlavní smyčky? Mají se zpracovat události, dokud nějaké jsou (představ si uživatele zuřivě měnícího myší velikost okna a pod.)? Opravdu chceš, aby na sekundu mrzlo GUI?

Viz

http://developer.gnome.org/gtk-faq/stable/x601.html

ale většinou je explicitní iterace výrazem maximálního zoufalství, protože kód pak není řízen událostmi.
7.8.2011 14:18 Petur
Rozbalit Rozbalit vše Re: Python + Gtk + sleep
Ono ani moc nejde o to, aby GUI mrzlo, ale aby se každou vteřinu vypsal ten text, aby se to každou vteřinu opakovalo. Když jsem to dal dohromady s tím příspěvkem níže, tak se mi to podařilo už rozjet, a teď se snažím přijít na to, jak to zase zastavit
7.8.2011 14:51 chrono
Rozbalit Rozbalit vše Re: Python + Gtk + sleep
Keď tá funkcia vráti False, prestane sa opakovať. Prípadne sa dá použiť funkcia glib.source_remove (ako parameter sa použije ID, ktoré vráti glib.timeout_add).
7.8.2011 21:10 Petur
Rozbalit Rozbalit vše Re: Python + Gtk + sleep
To je přesně ono. Díky moc!
7.8.2011 13:00 chrono
Rozbalit Rozbalit vše Re: Python + Gtk + sleep
Odpovědět | | Sbalit | Link | Blokovat | Admin
Problém je v tom, že ten text sa tam síce mení raz za sekundu, UI sa ale neprekreslí (práve kvôli tomu sleep), takže to vyzerá tak, ako keby to nič nerobilo.

Aby to robilo to čo chceš, budeš musieť použiť glib.timeout_add_seconds alebo glib.timeout_add. Vlastne tam stačí pridať (pred sleep) niečo ako
while gtk.events_pending():
   gtk.main_iteration(False)
to ale nezabráni tomu, aby sa UI prestalo vždy na tú sekundu reagovať.
mess avatar 7.8.2011 15:23 mess | skóre: 43 | blog: bordel | Háj ve Slezsku - Smolkov
Rozbalit Rozbalit vše Re: Python + Gtk + sleep
Odpovědět | | Sbalit | Link | Blokovat | Admin
Zeptám se blbě - nejde to spustit v dalším vlákně?
Cez párne mesiace zošíváš vaginy, cez neparne montuješ hajzle.
7.8.2011 15:29 chrono
Rozbalit Rozbalit vše Re: Python + Gtk + sleep
Spustiť v inom vlákne sa to určite dá, ale meniť niečo v UI z iného vlákna je málokedy dobrý nápad.
Josef Kufner avatar 7.8.2011 15:36 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Python + Gtk + sleep
Odpovědět | | Sbalit | Link | Blokovat | Admin
Na tohle kadý GUI toolkit obsahuje časovače.
Hello world ! Segmentation fault (core dumped)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.