Python 3.x 多处理 tkinter mainloop
Python 3.x multiprocessing tkinter mainloop
如何在 root.mainloop
上使用 multiprocessing
?我正在使用 Python 3.6。我需要在它之后做几行代码,有些需要对象。
我 不想创建第二个对象 ,就像我的问题的其他一些答案所暗示的那样。
这是一个小代码片段(设置为 JSON 对象):
from multiprocessing import Process
def check():
try: sett['setup']
except KeyError:
sett['troubleshoot_file']=None
check()
else:
if sett['setup'] is True: return
elif type(sett['setup']) is not bool: raise TypeError('sett[\'setup\'] is not a type of boolian (\'bool\')')
root.=Tk()
root['bg']='blue'
mainloop=Process(target=root.mainloop)
mainloop.start()
mainloop.join()
check()
但是,我得到了这个回溯:
Traceback (most recent call last):
File "(directory)/main.py", line 41, in <module>
check()
File "(directory)/main.py", line 39, in check
mainloop.start()
File "C:\Program Files (x86)\Python36-32\lib\multiprocessing\process.py", line 105, in start
self._popen = self._Popen(self)
File "C:\Program Files (x86)\Python36-32\lib\multiprocessing\context.py", line 223, in _Popen
return _default_context.get_context().Process._Popen(process_obj)
File "C:\Program Files (x86)\Python36-32\lib\multiprocessing\context.py", line 322, in _Popen
return Popen(process_obj)
File "C:\Program Files (x86)\Python36-32\lib\multiprocessing\popen_spawn_win32.py", line 65, in __init__
reduction.dump(process_obj, to_child)
File "C:\Program Files (x86)\Python36-32\lib\multiprocessing\reduction.py", line 60, in dump
ForkingPickler(file, protocol).dump(obj)
TypeError: can't pickle _tkinter.tkapp objects
我试过了运行:
from queue import Queue
from tkinter import Tk
from multiprocessing import Process
p=Process(target=q.get())
然后解释器彻底崩溃。
您不能跨多个进程或线程使用任何 tkinter 对象。如果您需要在 gui 和其他进程之间共享数据,您将需要设置一个队列,并从 GUI 中轮询队列。
原因是 tkinter 是 tcl 解释器的包装器,它对 python 线程或进程一无所知。
您将在 link 找到有关如何执行此操作的信息:
docs.python.org/3.6/library/queue.html
如何在 root.mainloop
上使用 multiprocessing
?我正在使用 Python 3.6。我需要在它之后做几行代码,有些需要对象。
我 不想创建第二个对象 ,就像我的问题的其他一些答案所暗示的那样。
这是一个小代码片段(设置为 JSON 对象):
from multiprocessing import Process
def check():
try: sett['setup']
except KeyError:
sett['troubleshoot_file']=None
check()
else:
if sett['setup'] is True: return
elif type(sett['setup']) is not bool: raise TypeError('sett[\'setup\'] is not a type of boolian (\'bool\')')
root.=Tk()
root['bg']='blue'
mainloop=Process(target=root.mainloop)
mainloop.start()
mainloop.join()
check()
但是,我得到了这个回溯:
Traceback (most recent call last):
File "(directory)/main.py", line 41, in <module>
check()
File "(directory)/main.py", line 39, in check
mainloop.start()
File "C:\Program Files (x86)\Python36-32\lib\multiprocessing\process.py", line 105, in start
self._popen = self._Popen(self)
File "C:\Program Files (x86)\Python36-32\lib\multiprocessing\context.py", line 223, in _Popen
return _default_context.get_context().Process._Popen(process_obj)
File "C:\Program Files (x86)\Python36-32\lib\multiprocessing\context.py", line 322, in _Popen
return Popen(process_obj)
File "C:\Program Files (x86)\Python36-32\lib\multiprocessing\popen_spawn_win32.py", line 65, in __init__
reduction.dump(process_obj, to_child)
File "C:\Program Files (x86)\Python36-32\lib\multiprocessing\reduction.py", line 60, in dump
ForkingPickler(file, protocol).dump(obj)
TypeError: can't pickle _tkinter.tkapp objects
我试过了运行:
from queue import Queue
from tkinter import Tk
from multiprocessing import Process
p=Process(target=q.get())
然后解释器彻底崩溃。
您不能跨多个进程或线程使用任何 tkinter 对象。如果您需要在 gui 和其他进程之间共享数据,您将需要设置一个队列,并从 GUI 中轮询队列。
原因是 tkinter 是 tcl 解释器的包装器,它对 python 线程或进程一无所知。
您将在 link 找到有关如何执行此操作的信息: docs.python.org/3.6/library/queue.html