【发布时间】:2014-11-10 00:22:52
【问题描述】:
我正在尝试创建一个应用程序,其中 Tkinter GUI 由其他不断获取数据的对象更新。我在使用多线程时遇到了问题,所以我决定尝试使用多处理模块。
我发现您无法在 multiprocessing.Process 内运行 Tkinter 窗口,这是最小的示例:
import Tkinter as tk
import multiprocessing
class Subprocess(multiprocessing.Process):
def __init__(self):
multiprocessing.Process.__init__(self)
self.root = tk.Tk()
#
def run(self):
self.root.mainloop()
#
def stop(self):
self.root.destroy()
self.terminate()
if __name__ == '__main__':
process = Subprocess()
process.start()
print "I got around the global interpreter lock"
raw_input()
print "exiting"
process.stop()
我期望发生的是弹出一个 Tk 窗口,并且“我绕过了全局解释器锁定”显示在终端中。我在 ubuntu linux 上对此进行了测试,它运行良好,但是当我切换到 Windows 7(我正在开发我的应用程序)时,它没有给我错误:
Traceback (most recent call last):
File "C:\pathtoscript\multiprocessing_test.py", line 21, in <module>
process.start()
File "C:\Python27\lib\multiprocessing\process.py", line 130, in start
self._popen = Popen(self)
File "C:\Python27\lib\multiprocessing\forking.py", line 277, in __init__
dump(process_obj, to_child, HIGHEST_PROTOCOL)
File "C:\Python27\lib\multiprocessing\forking.py", line 199, in dump
ForkingPickler(file, protocol).dump(obj)
File "C:\Python27\lib\pickle.py", line 224, in dump
self.save(obj)
File "C:\Python27\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "C:\Python27\lib\pickle.py", line 419, in save_reduce
save(state)
File "C:\Python27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Python27\lib\pickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "C:\Python27\lib\pickle.py", line 681, in _batch_setitems
save(v)
File "C:\Python27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Python27\lib\pickle.py", line 725, in save_inst
save(stuff)
File "C:\Python27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Python27\lib\pickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "C:\Python27\lib\pickle.py", line 681, in _batch_setitems
save(v)
File "C:\Python27\lib\pickle.py", line 313, in save
(t.__name__, obj))
PicklingError: Can't pickle 'tkapp' object: <tkapp object at 0x02BD3D08>
有人知道解决方法吗?这对我来说似乎很奇怪,这适用于 linux 但不适用于 Windows。
【问题讨论】:
标签: python windows python-2.7 tkinter multiprocessing