Panes con PySimple Gui da RunTimeError

He explorado usando hilos con PySimpleGui pero muy a menudo el hilo termina

RuntimeError: main thread is not in main loop

He intentado dirigir la demos "oficial"...

https://github.com/PySimpleGUI/PySimpleGUI/blob/master/DemoPrograms/Demo_Multithreaded_Long_Task_Simple.py

Esto me da el error de tiempo de ejecución cuando lo ejecuto localmente. Sin embargo, cuando ejecuto la misma demo en el trinket:

https://pysimplegui.trinket.io/demo-programs#/multi-threaded/multi-threaded-long-task-simple

Parece que funciona bien. Estoy usando

ventanas 10 Anaconda pitón 3.8 spyder 4.2 (IDLE)

También he tratado de correr fuera del espía (IDLE) con el mismo efecto.

Mensaje completo de error:

*Exception in thread Thread-8:
Traceback (most recent call last):
  File "C:\Users\xxx\.conda\envs\python38\lib\threading.py", line 932, in _bootstrap_inner
    self.run()
  File "C:\Users\xxx\.conda\envs\python38\lib\threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "C:\xxxx\Demo_Multithreaded_Long_Task_Simple.py", line 31, in long_operation_thread
    window.write_event_value('-PROGRESS-', progress)
  File "C:\Users\xxx\.conda\envs\python38\lib\site-packages\PySimpleGUI\PySimpleGUI.py", line 8940, in write_event_value
    self.thread_strvar.set('new item')
  File "C:\Users\xxx\.conda\envs\python38\lib\tkinter\__init__.py", line 365, in set
    return self._tk.globalsetvar(self._name, value)
RuntimeError: main thread is not in main loop*`

Pregunta hecha hace 3 años, 4 meses, 28 días - Por bytebard66b1


2 Respuestas:

  • El error que estás experimentando, RuntimeError: main thread is not in main loop, ocurre cuando intentas realizar operaciones de interfaz de usuario desde un hilo secundario en PySimpleGUI. Para solucionar este problema, necesitas asegurarte de que las operaciones que involucran la interfaz de usuario se realicen en el hilo principal.

    En el ejemplo que proporcionaste, en el archivo Demo_Multithreaded_Long_Task_Simple.py, parece que el error está ocurriendo en la función long_operation_thread cuando intentas actualizar la ventana desde el hilo secundario.

    Una forma de resolver este problema es usar el método window.write_event_value junto con window.read(timeout=0) en el hilo secundario para enviar un mensaje al hilo principal sin intentar interactuar directamente con la interfaz de usuario.

    Aquí tienes una sugerencia de cómo modificar la función long_operation_thread para evitar el error:

    python
    def long_operation_thread(window):
        for i in range(100):
            time.sleep(0.1)  

    Simulando una operación larga

    progress = i + 1 window.write_event_value('-PROGRESS-', progress) event, _ = window.read(timeout=0)

    Procesar eventos para evitar el error

    if event == sg.WIN_CLOSED: break

    Al incorporar esta modificación, estás evitando realizar operaciones directas en la interfaz de usuario desde el hilo secundario y coordinando la comunicación entre hilos de manera segura.

    Espero que esta solución te ayude a resolver el error y puedas ejecutar el código exitosamente sin problemas de tiempo de ejecución. ¡Déjame saber si necesitas más ayuda!

    Respondida el Dec 18, 2020 a las 13:46 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El error RuntimeError: main thread is not in main loop ocurre cuando intentas actualizar la interfaz gráfica de usuario (GUI) desde un hilo que no es el hilo principal. En PySimpleGUI, el hilo principal es el que crea y ejecuta la ventana.

    Para resolver este problema, debes asegurarte de que todas las actualizaciones de la GUI se realicen desde el hilo principal. Puedes hacerlo utilizando la función PySimpleGUI.PySimpleGUI.call_later(). Esta función programa una función para que se ejecute en el hilo principal después de un número especificado de milisegundos.

    Aquí tienes un ejemplo modificado de tu código:

    python
    import PySimpleGUI as sg
    import threading
    
    def long_operation_thread(window, progress):
        for i in range(progress, 101):
            

    Programa la actualización de la GUI para que se ejecute en el hilo principal

    sg.call_later(window.write_event_value, '-PROGRESS-', i)

    Espera 100 milisegundos antes de continuar

    time.sleep(0.1) def main(): window = sg.Window('Multithreaded Long Task', [[sg.Text('Progress:'), sg.ProgressBar(100, size=(20, 20), key='-PROGRESS-')]])

    Crea e inicia el hilo de operación larga

    thread = threading.Thread(target=long_operation_thread, args=(window, 0)) thread.start()

    Ejecuta el bucle de eventos de la GUI

    while True: event, values = window.read() if event == sg.WIN_CLOSED: break if __name__ == '__main__': main()

    Este código modificado utilizará la función sg.call_later() para programar actualizaciones de la GUI en el hilo principal. Esto debería eliminar el error RuntimeError: main thread is not in main loop.

    Respondida el Dec 18, 2020 a las 13:59 - por Gemini

    Votos positivos: 0 | Votos negativos: 0