问题是当我想从回调 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)
我在主函数中尝试了相同的代码,并且它执行得很好,但是从回调中这不会执行。
您不能将 tkinter 对象传递给单独的进程。多重处理使用 pickle 使对象可传输,并且如错误所述,您无法 pickle tkinter 对象。
这是因为,从本质上讲,tkinter 对象作为嵌入式 tcl 解释器中的对象存在。这些对象根本无法移动、复制或与其他进程共享。
您需要找到一种方法将数据传递到单独的进程,而不是让进程尝试直接访问小部件。