来自回调 tkinter 的多处理

问题描述 投票:0回答:1

问题是当我想从回调 tkinter 触发进程“多重处理”时,特别是从函数 tkinter 的绑定触发。错误从这里开始:

File "c:\Users\Usuario\Downloads\engine_controller_ls\extractText\funciones\reproductor.py", line 598, in __init__     p.start()   File "C:\Program Files\Python311\Lib\multiprocessing\process.py", line 121, in start     self._popen = self._Popen(self)                   ^^^^^^^^^^^^^^^^^   File "C:\Program Files\Python311\Lib\multiprocessing\context.py", line 224, in _Popen     return _default_context.get_context().Process._Popen(process_obj)            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^   File "C:\Program Files\Python311\Lib\multiprocessing\context.py", line 336, in _Popen     return Popen(process_obj)            ^^^^^^^^^^^^^^^^^^   File "C:\Program Files\Python311\Lib\multiprocessing\popen_spawn_win32.py", line 95, in __init__     reduction.dump(process_obj, to_child)   File "C:\Program Files\Python311\Lib\multiprocessing\reduction.py", line 60, in dump     ForkingPickler(file, protocol).dump(obj) TypeError: cannot pickle '_tkinter.tkapp' object

main.py

from reproductor import MediaPlayer

def item_selected(event):
    """
    Evento invocado cuando el contenido de una carpeta es abierto.
    """
    item_seleccionado = arbol.selection()
    item = arbol.item(item_seleccionado)
    print(item)
    
    #Extraer la ruta del archivo y si encuentra espacios unirlos
    ruta = ""
    for element in item["values"]:
        ruta += element + " "

    
    #Iniciacion del video
    global reproductor_video

    # Cerrar el video para que no se abra en multiples ventanas
    if reproductor_video is not None:
        reproductor_video.ClosePlayer()
    
    reproductor_video = MediaPlayer(ruta, frame_visualizer, frame_botones_procesar, spinInicio=inBox_inicio, spinFinal=inBox_fin, spinActual=inBox_Actual, mainVideo=True)
    reproductor_video.update_progres_video()

arbol = CheckboxTreeview(frame_Tree_in)
arbol.bind("<<TreeviewSelect>>", item_selected)

reproductor.py

class MediaPlayer:
    def __init__(ruta, frame_visualizer, frame_botones_procesar, spinInicio=inBox_inicio, spinFinal=inBox_fin, spinActual=inBox_Actual, mainVideo=True):
        p = Process(target=self.funcion1)
        p.start()
        #p.join

    def funcion1(self):
        cont = 0
        while cont < 100:
            cont += 1
            print("contador =", cont)

我在主函数中尝试了相同的代码,并且它执行得很好,但是从回调中这不会执行。

python tkinter multiprocessing
1个回答
0
投票

您不能将 tkinter 对象传递给单独的进程。多重处理使用 pickle 使对象可传输,并且如错误所述,您无法 pickle tkinter 对象。

这是因为,从本质上讲,tkinter 对象作为嵌入式 tcl 解释器中的对象存在。这些对象根本无法移动、复制或与其他进程共享。

您需要找到一种方法将数据传递到单独的进程,而不是让进程尝试直接访问小部件。

© www.soinside.com 2019 - 2024. All rights reserved.