Ok, desculpe, apenas li o código do cara e não testei ele :P
Tentei reproduzir o meu problema em um programa simples. Escrevi três
versões bastante semelhantes e postei em [1, 2, 3]. Na versão [1] uso
o método gobject.idle_add() que faz com que o diálogo apareça mas
trave quando o usuário clica em ok. Na versão [2] apenas chamo a
função que cria o diálogo, o Xlib reclama que existe outra
thread/processo tentando desenhar na tela e o programa trava. Na
última versão [3] (consegui fazer funcionar baseado no código do cara
ali do post que citei no email anterior), ao invés de usar o idle_add
e o método gtk.MessageDialog.run() uso o método
gtk.MessageDialog.show_all() e crio uma função para tratar a resposta
do diálogo. A última versão soluciona meu problema, sim, mas é uma mão
a mais ficar criando uma nova função para cada diálogo para tratar dos
response_id que eram retornados pelo método run. Por que usando o run
não funciona? O que o run faz por baixo dos panos que bagunça tudo?
Tem como solucionar isso?
Obrigado,
Bruno.
programa travando:
[1] http://pastebin.com/m2fe27565
Xlib reclamando:
[2] http://pastebin.com/m38228696
funcionando:
[3] http://pastebin.com/m56acab9e
------------------------------------
,-----------------------------------------------------------.
| Antes de enviar um e-mail para o grupo leia: |
| http://www.pythonbrasil.com.br/moin.cgi/AntesDePerguntar |
| E se você é usuário do BOL lembre-se de cadastrar o |
| e-mail do grupo na lista branca do seu sistema anti-spam. |
`-----------------------------------------------------------´Links do Yahoo! Grupos
<*> Para visitar o site do seu grupo na web, acesse:
http://br.groups.yahoo.com/group/python-brasil/
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@yahoogrupos.com.br
<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
http://br.yahoo.com/info/utos.html
Bruno,
eu já tive esse problema da Xlib reclamar com esse tipo de coisa e a
solução era, cada vez que eu chamasse funções da gtk *fora* de um
callback do meu programa eu precisava colocar meu bloco de código
entre chamadas gtk.gdk.threads_enter() e gtk.gdk.threads_leave().
Por exemplo:
def atualiza_buffer(text_buffer, texto):
gtk.gdk.threads_enter()
text_buffer.insert(text_buffer.get_end_iter(), texto)
gtk.gdk.threads_leave()
A minha chamada para o gtk.main() também precisou dessas chamadas em volta:
gtk.gdk.threads_enter()
gtk.main()
gtk.gdk.threads_leave()
Eu não tenho como testar o código aqui, mas existe uma chance disso
solucionar o problema:
def test_thread():
print 'thread start'
time.sleep(3)
gtk.gdk.threads_enter()
show_dialog('thread end')
gtk.gdk.threads_leave()
print 'thread end'
--
Kao Cardoso Félix
Página pessoal: http://www.inf.ufrgs.br/~kcfelix
Blog: http://kaofelix.blogspot.com
É verdade, funcionou. Obrigado pela ajuda. Uma pena não ser possível
lidar com threads sem se preocupar com esses detalhes.
Abraço,
--
Bruno Menegola