es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

pysimpleGUI – creando un hilo sobre la marcha

He creado una interfaz de usuario gráfica (GUI) con PysimpleGUI que tiene varios botones. La intención es que los usuarios hagan clic en un botón y continúen trabajando en otra tarea mientras se ejecuta la acción del primer botón en segundo plano. Y cuando la acción del botón clicado haya terminado, el hilo se cierra (destruye el hilo actual).

El código está lanzando: RuntimeError: el hilo principal no está en el bucle principal.

¿Alguien puede ayudarme a crear el proceso de inicio del nuevo hilo (thread.start_new_thread) e incorporarlo al bucle principal o tal vez proporcionar una solución para evitar el RuntimeError?

Para la creación de hilos, estoy utilizando: _thread

El código:

class Windows:
    def newOpenGraph(self, window, event, values):
        '''
        abre un nuevo gráfico sin problema
        '''

    def newThread(self, window, event, values):
        isRunning = True
        if event == 'OPEN GRAPH':
            _thread.start_new_thread(self.newOpenGraph, (window, event, values ))
        isRunning = False

        while isRunning:
            schedule.run_pending()
            time.sleep(1)

    def mainLayout(self):
        '''
        estructura del marco principal
        '''

        while True:
            event, values = window.read()
            if event == 'OPEN GRAPH':
                self.newThread(window, event, values)

La imagen:

enter image description here

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema es que estás iniciando un nuevo hilo fuera del bucle principal y estás intentando modificar la interfaz gráfica de usuario desde ese hilo. Necesitas iniciar el nuevo hilo dentro del bucle principal y usar una cola para pasar mensajes entre los hilos. Aquí tienes un código de ejemplo:

    import queue
    import threading
    import time
    import PySimpleGUI as sg
    
    # Crea una cola para pasar mensajes entre hilos
    cola = queue.Queue()
    
    class Ventanas:
        def __init__(self):
            self.ventana = sg.Window('Ventana')
    
        def nuevaAperturaGrafico(self):
            # haz algo que tome tiempo
            time.sleep(5)
            # cuando termine, coloca un mensaje en la cola para actualizar la interfaz
            cola.put('apertura del gráfico finalizada')
    
        def diseñoPrincipal(self):
            diseño = [[sg.Button('ABRIR GRÁFICO')]]
    
            while True:
                evento, valores = self.ventana.read(timeout=100)
    
                if evento == sg.WINDOW_CLOSED:
                    break
    
                if not cola.empty():
                    # si hay un mensaje en la cola, actualiza la interfaz
                    mensaje = cola.get()
                    sg.popup(mensaje)
    
                if evento == 'ABRIR GRÁFICO':
                    # inicia el nuevo hilo dentro del bucle principal
                    threading.Thread(target=self.nuevaAperturaGrafico).start()
    
            self.ventana.close()
    
    # Crea un nuevo objeto Ventanas y ejecuta el diseño principal
    Ventanas().diseñoPrincipal()
    

    En este código, la función nuevaAperturaGrafico se ejecuta en un nuevo hilo cuando se hace clic en el botón ‘ABRIR GRÁFICO’. Después de que la función finaliza, coloca un mensaje en la cola para procesarlo en el bucle principal. El bucle principal verifica si hay mensajes en la cola en cada iteración y actualiza la interfaz gráfica si hay mensajes. De esta manera, no estás intentando modificar la interfaz gráfica desde un hilo separado, lo cual puede causar problemas.

Comments are closed.