Pergunta

Eu tenho um problema com tópicos em pygtk. Meu aplicativo consiste em um programa que baixa imagens da internet e, em seguida, exibe-lo com pygtk. O problema é que, a fim de fazer isso e manter a GUI responsivo, eu preciso tópicos de uso.

Então, eu entrei em uma chamada de retorno depois que o usuário clicou no botão "Download pictures" e eu chamo o método para baixar as imagens que está dentro dessa mesma classe.

thread.start_new_thread (self.images_download, (caminho, páginas)

Isso não vai funcionar. A única maneira para que meu programa para entrar no segmento está usando

gtk.threads_init ()

Antes de iniciar qualquer tópico. Agora ele baixa as imagens, mas a GUI permanece sem resposta. Eu pesquisei isso e eu tentei colocar gtk.threads_enter e gtk.threads_leave em torno dos tópicos, mas ele simplesmente não funciona.

Foi útil?

Solução

A sua pergunta é um pouco vago, e sem uma referência ao seu código real é difícil especular o que você está fazendo errado.

Então, eu vou lhe dar algumas indicações para ler, então especular descontroladamente com base na experiência.

Em primeiro lugar, você parece pensar que você só pode manter o GUI responsiva usando threads. Isso não é verdade. Você também pode escrever seu código de forma assíncrona, e fazer tudo em um aplicativo single-threaded. torcida é construída sobre este modelo de programação. Recentemente fez um post blog que explica como eu criei uma interface tarefa assíncrona, e exemplo corredores tanto para CLI e GTK +. Você pode olhar para esses exemplos para ver como as tarefas podem ser implementadas de forma assíncrona, ea interface do usuário ainda é atualizado.

Em segundo lugar, se você preferir usar tópicos, por algum motivo, você precisa entender o GTK + modelo de segmento um pouco.

Você deve começar por ler entrada O PyGTK FAQ sobre o assunto , e você pode achar este post no blog fácil de entender também.

Agora, sobre a especulação. Eu estou supondo que você está tentando atualizar o seu GTK UI do segmento, e não manusear o bloqueio corretamente. Se este for o caso, você é melhor fora por agora adiando todas as suas atualizações de interface do usuário que você deseja fazer a partir de tópicos para o segmento principal usando gobject.idle_add () Desta forma, todas as chamadas de interface do usuário será feita a partir do thread principal. É um modelo mental mais fácil seguir em sua programação.

Uma vez que você sentir que você realmente entender o threading e modelos de bloqueio, você poderia considerar atualizar a interface do usuário de seus tópicos, mas é fácil perder um threads_enter () / threads_leave ()

Outras dicas

Você pode usar gtk.gdk.threads_init (), a fim de permitir que qualquer fio de modificar a interface do usuário com o gtk.gdk.threads_enter respeitando () e gtk.gdk.theads_leave () de bloqueio, mas, o problema com isto é que não funciona bem no Windows. Eu testei-o em Linux e executa muito bem, mas não tive sorte de fazer isso para trabalho ao longo win32.

=== === Editar

Eu tenho sido navegando sobre isso, você pode fazer uso do gobject.io_add_watch para verificar se há algo em seu soquete, agarrá-lo e, em seguida, atualizar o GUI. verificar o meu post sobre isso: Sockets (e alguns outros arquivos) e PyGTK sem fios.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top