Multitraitement à partir du rappel tkinter

WBOY
Libérer: 2024-02-22 14:10:03
avant
339 Les gens l'ont consulté

来自回调 tkinter 的多处理

Contenu de la question

Le problème est lorsque je veux déclencher un processus "multitraitement" à partir d'un rappel tkinter (en particulier la liaison de la fonction tkinter). L'erreur commence ici :

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)
Copier après la connexion

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)
Copier après la connexion

J'ai essayé le même code dans la fonction principale et il s'est bien exécuté, mais à partir du rappel, il ne s'exécutera pas.


Bonne réponse


Original

La solution est là pour ceux qui en ont besoin, en fait si elle peut être lancée depuis un événement sur tkinter comme celui-ci :

Traduction (Google Traduction) :

La solution est là pour ceux qui en ont besoin, en effet elle peut être lancée depuis un événement en tkinter comme ceci :

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)
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!