问题是当我想从回调 tkinter(特别是函数 tkinter 的绑定)触发进程“多重处理”时。错误从这里开始:
file“c:usersusuariodownloadsengine_controller_lsextracttextfuncionesreproductor.py”,第 598 行,在 __init__ p.start() 文件“c:program filespython311libmultiprocessingprocess .py”,第 121 行,开始 self._popen = self._popen(self) ^^^^^^^^^^^^^^^^^^ 文件“c:program filespython311libmultiprocessing context.py”,第 224 行,在 _popen 中返回 _default_context.get_context().process._popen(process_obj) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 文件“c:program filespython311libmultiprocessingcontext.py”,第 336 行,在 _popen 返回 popen(process_obj) ^^^^^^^^^^^^^^^^^^^ 文件 "c:program filespython311libmultiprocessingpopen_spawn_win32.py",第 95 行,在 __init__duction.dump(process_obj, to_child) 文件“c:program filespython311libmultiprocessingreduction.py”中,第 60 行,在转储 forkingpickler(file, protocol).dump(obj) 中 typeerror: 无法 pickle ' _tkinter.tkapp'对象
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 上的事件启动,如下所示:
翻译(谷歌翻译):
解决方案在这里为那些需要它的人提供,事实上它可以从 tkinter 中的事件启动,如下所示:
from multiprocessing import Process, log_to_stderr, get_logger
import time
from tkinter import Tk
from tkinter import ttk
import logging
import sys
def item_selected(event):
my_objeto = objeto()
button_eraser.config(command=lambda:my_objeto.lanzador(2))
button_marco.config(command=lambda:my_objeto.lanzador(1))
my_objeto.start_player()
class objeto:
def __init__(self) -> None:
#self.start_player()
pass
def start_player(self):
pass
def funcion1(self):
contador = 0
while 1:
contador += 1
print("Func1: ", contador, self.palabra)
time.sleep(0.1)
if contador > 80:
break
q = Process(target=self.funcion3)
q.start()
#q.join()
def funcion2(self):
contador = 0
while 1:
contador += 2
print("Func2: ", contador)
time.sleep(0.2)
if contador > 120:
break
def funcion3(self):
contador = 0
while 1:
contador += 2
print("Func3: ", contador)
time.sleep(0.02)
if contador > 200:
break
def lanzador(self,mode):
log_to_stderr(logging.DEBUG)
logger = get_logger()
logger.setLevel(logging.INFO)
if mode == 1:
self.p = Process(target=self.funcion1)
self.p.start()
elif mode == 2:
self.p = Process(target=self.funcion2)
self.p.start()
def unir(self):
self.p.join()
print("Salio")
def iniciar_multis(self):
self.lanzador(2)
self.lanzador(1)