PHP前端开发

来自回调 tkinter 的多处理

百变鹏仔 1天前 #Python
文章标签 回调
问题内容

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

file“c:usersusuariodownloadsengine_controller_lsextracttextuncioneseproductor.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 filespython311libmultiprocessingeduction.py”中,第 60 行,在转储 forkingpickler(file, protocol).dump(obj) 中 typeerror: 无法 pickle ' _tkinter.tkapp'对象

ma​​in.py

from reproductor import mediaplayerdef 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(">", 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 <p>我在主函数中尝试了相同的代码,并且它执行得很好,但是从回调中它不会执行。</p><br><h2 class="daan">正确答案</h2><br><h3>原版</h3><p>解决方案在这里为那些需要它的人提供,实际上,如果它可以从 tkinter 上的事件启动,如下所示:</p><h3>翻译(谷歌翻译):</h3><p>解决方案在这里为那些需要它的人提供,事实上它可以从 tkinter 中的事件启动,如下所示:</p><pre class="brush:py;toolbar:false;">from multiprocessing import Process, log_to_stderr, get_loggerimport timefrom tkinter import Tkfrom tkinter import ttkimport loggingimport sysdef 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) -&gt; 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 &gt; 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 &gt; 120:                break        def funcion3(self):        contador = 0        while 1:            contador += 2            print("Func3: ", contador)            time.sleep(0.02)            if contador &gt; 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)