来自回调 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) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 文件“c:\program 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\multiprocessing\reduction.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)
以上就是来自回调 tkinter 的多处理的详细内容,更多请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
来自回调 tkinter 的多处理
下载Word文档到电脑,方便收藏和打印~