Heim > Backend-Entwicklung > Python-Tutorial > Multiprocessing von Callback tkinter

Multiprocessing von Callback tkinter

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Freigeben: 2024-02-22 14:10:03
nach vorne
460 Leute haben es durchsucht

来自回调 tkinter 的多处理

Frageninhalt

Das Problem besteht darin, dass ich den Prozess „Multiprocessing“ von einem Callback-Tkinter aus auslösen möchte (insbesondere die Bindung der Funktion Tkinter). Der Fehler beginnt hier:

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)
Nach dem Login kopieren

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)
Nach dem Login kopieren

Ich habe den gleichen Code in der Hauptfunktion ausprobiert und er wurde einwandfrei ausgeführt, aber vom Rückruf aus wird er nicht ausgeführt.


Richtige Antwort


Original

Die Lösung ist für diejenigen da, die sie brauchen, und zwar dann, wenn sie von einem Event auf tkinter wie diesem gestartet werden kann:

Übersetzung (Google Translate):

Die Lösung ist für diejenigen da, die sie brauchen. Tatsächlich kann sie über eine Veranstaltung in tkinter wie diese gestartet werden:

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)
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonMultiprocessing von Callback tkinter. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage