Usando threads para descongelar o loop do evento principal
Freqüentemente, elementos da GUI, como barras de progresso, "congelam" enquanto operações intensivas são executadas no tópico principal. Isso acontece porque o loop de eventos principal, que trata das interações do usuário e das atualizações da GUI, está bloqueado. Para evitar isso, multithreading pode ser empregado para executar tarefas de longa duração em um thread separado.
No cenário específico fornecido, um clique no botão deve iniciar uma animação da barra de progresso por cinco segundos. Porém, o comportamento observado é que o botão congela durante esse período. Isso pode ser resolvido usando threads, mas a junção do thread no thread principal faz com que ele espere até a conclusão, bloqueando efetivamente a GUI.
Abordagem Alternativa: Lógica Separada em Classes
Em vez de lidar com tudo dentro de uma única classe GUI, é possível colocar a parte lógica em uma classe diferente e instanciar a GUI dessa classe. No entanto, isso requer uma maneira de chamar o método de classe lógica da classe GUI. a classe GUI e a classe lógica podem ser consideradas. As etapas a seguir descrevem essa abordagem:
Crie um objeto Queue no thread principal.
Inicie um novo thread com acesso à fila.Verifique periodicamente o fila do thread principal.import queue classe GUI: # O código para configuração da GUI vai aqui def tb_click(self): self.progress() self.prog_bar.start() self.queue = fila.Queue() ThreadedTask(self.queue).start() self.master.after(100, self.process_queue) def process_queue(self): tentar: mensagem = self.queue.get_nowait() #Mostra o resultado da tarefa se necessário self.prog_bar.stop() exceto fila.Vazio: self.master.after(100, self.process_queue) classe ThreadedTask(threading.Thread): def __init__(self, fila): super().__init__() self.queue = fila def execução (auto): time.sleep(5) # Simula processo de longa execução self.queue.put("Tarefa concluída")Essa abordagem mantém efetivamente o thread principal em execução e responsivo enquanto a tarefa de longa execução é executada em um thread separado.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3