Ano, základem GUI v GTK (a i jinde) je smyčka - main event loop. Mimochodem, tato smyčka se dá udělat i ručně, pomocí gtk.events_pending() a gtk.main_iteration(block=True).
To mě vlastně přivedlo na myšlenku, můžeš si nastavit pravidelné volání nějakého kódu a v něm si tu hlasitost z Alsy zjišťovat - glib.timeout_add(interval, callback, ...). To už vypadá elegantně. Samozřejmě že ten volaný kód (callback) nesmí trvat moc dlouho, jinak bude GUI zamrzávat. Toto řešení mě mělo napadnout hned... 2009/6/30 Filip Bartmann <[email protected]>: > gtk.main() je co jsem prozatím ze zkoušení zjistil nekonečná smyčka a > jakmile spustím gtk.main(), tak se už žádný další kód, který není > vyvolán něcím v GUI nespustí, do ukončení gtk.main(). > > Proto to zkouším řešit přes podprocesy/vlákna. A kdybych to hlavního > procesu dal monitorování roury, tak bych to zase musel mít ve while > True, ne? > > Jde to v Pythonu řešit nějak elegantněji? > > Děkuji. > > Dne Tue, 30 Jun 2009 12:05:02 +0200 > Petr Messner <[email protected]> napsal(a): > >> V půlce programu si to klidně forkneš a očekáváš, že z potomka si v >> pohodě můžeš měnit proměnné v rodičkovském procesu, navíc z obou >> procesů saháš do GTK? No fuj :-) GTK je myslím thread-safe (po nějaké >> inicializaci, pokud si dobře vzpomínám), ale že by i >> multiprocess-safe, to pochybuji :-) >> >> Doporučuji použít místo podprocesů vlákna nebo zařídit nějakou >> meziprocesovou komunikaci - nejjednodušeji asi rouru/socketpair - tak >> aby s GUI manipuloval jen jeden proces. >> >> PM >> >> 2009/6/30 Filip Bartmann <[email protected]>: >> > V této části kódu: >> > ---------------------------------------------------------------------------------- >> > def __init__(self): >> > self.mixer=alsa.Mixer(); >> > if self.mixer.getmute()[0]==0: >> > >> > self.icon=gtk.status_icon_new_from_stock(gtk.STOCK_YES); >> > else: >> > >> > self.icon=gtk.status_icon_new_from_stock(gtk.STOCK_NO); >> > >> > pid=os.fork(); >> > if pid==0: >> > while True: >> > mixer=alsa.Mixer(); >> > if mixer.getmute()[0]==0: >> > print "UNMUTED"; >> > >> > self.icon.set_from_stock(gtk.STOCK_YES); >> > elif mixer.getmute()[0]==1: >> > print "MUTED"; >> > >> > self.icon.set_from_stock(gtk.STOCK_NO); >> > time.sleep(1); >> > >> > self.icon.connect("popup-menu",self.show_controls); >> > ---------------------------------------------------------------------------------- >> > >> > mám problém v přístupem k self.icon v potomkovi. Na CMDLině mi to >> > sice správně hlási MUTED/UNMUTED ale ikona se nemění. Nevíte kde >> > mám chybu? >> > >> > Za rady předem děkuji. >> > >> > Filip Bartmann >> > _______________________________________________ >> > Python mailing list >> > [email protected] >> > http://www.py.cz/mailman/listinfo/python >> > >> _______________________________________________ >> Python mailing list >> [email protected] >> http://www.py.cz/mailman/listinfo/python > _______________________________________________ > Python mailing list > [email protected] > http://www.py.cz/mailman/listinfo/python > _______________________________________________ Python mailing list [email protected] http://www.py.cz/mailman/listinfo/python
