來自回調 tkinter 的多處理

WBOY
發布: 2024-02-22 14:10:03
轉載
339 人瀏覽過

来自回调 tkinter 的多处理

問題內容

問題是當我想從回呼 tkinter(特別是函數 tkinter 的綁定)觸發進程「多重處理」時。錯誤從這裡開始:

file“c:\users\usuario\downloads\engine_controller_ls\extracttext\funciones\reproductor.py”,第598 行,在__init__ p.start() 檔案「c:\program files\python311\ lib\multiprocessing\process .py”,第121 行,開始self._popen = self._popen(self) ^^^^^^^^^^^^^^^^^^ 檔案“c:\program files\ python311\lib\multiprocessing\ context.py”,第224 行,在_popen 中返回_default_context.get_context().process._popen(process_obj) ^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ files\python311\lib\multiprocessing\context.py”,第336 行,在_popen 返回popen(process_obj) ^^^^^^^^^^^^^^^^^^^ 文件"c:\program files\python311\lib\multiprocessing\popen_spawn_win32.py",第95 行,在__init__duction.dump(process_obj, to_child) 檔案「c:\program files\python311\lib\mul, to_child) 檔案「c:\program files\python311\lib\mul, to_child) 檔案「c:\program files\python311\lib\mul. ,在轉儲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 上的事件啟動,如下所示:

翻譯(Google翻譯):

解決方案在這裡為需要它的人提供,事實上它可以從 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)
登入後複製

以上是來自回調 tkinter 的多處理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!