我最近开始玩进程。为了尝试一些东西,我编写了一个非常简单的GUI,并考虑了以下内容:
为此,我尝试通过管道将StringVar发送到另一个进程,对其进行编辑,然后将其发回。相关代码如下:
def changeText(pipe1, pipe2, str):
while 1:
if pipe1[1].recv() == "a":
print("received")
str.set("clicked")
pipe2[0].send(str)
else:
pass
def buttonClicked(pipe):
pipe[0].send("a")
txt2go = tk.StringVar(master=root, value="not clicked")
btn1 = tk.Button(text = "go", command = lambda : buttonClicked(pipe1))
btn1.place(x=50, y=80)
proses1 = mp.Process(target=changeText, args=(pipe1, pipe2, txt2go))
proses1.start()
但是,程序会给出以下输出(甚至在我尝试接收StringVar之前):
Process Process-1:
received
Traceback (most recent call last):
File "/usr/lib/python3.5/multiprocessing/process.py", line 249, in _bootstrap
self.run()
File "/usr/lib/python3.5/multiprocessing/process.py", line 93, in run
self._target(*self._args, **self._kwargs)
File "/home/cetin/PycharmProjects/Process_deneme_PC /Process_deneme_pc.py", line 9, in changeText
pipe2[0].send(str)
File "/usr/lib/python3.5/multiprocessing/connection.py", line 206, in send
self._send_bytes(ForkingPickler.dumps(obj))
File "/usr/lib/python3.5/multiprocessing/reduction.py", line 50, in dumps
cls(buf, protocol).dump(obj)
_pickle.PicklingError: Can't pickle <class '_tkinter.tkapp'>: attribute lookup tkapp on _tkinter failed
这是什么意思,你能提出一些解决办法吗?你知道吗
我的问题是我无法触发GUI进行自我更新。然而,{cd2}是一个研究对象,其中cd1是在cd2之后发现的。要触发更改,必须使用
while 1:
循环更新内容,而不是使用mainloop()
。你知道吗而且,Python似乎更多地使用了队列而不是管道。使用管道进行异步进程间通信很困难,因为进程被
.recv()
调用阻塞,直到有内容可读取。对于队列,这个问题可以通过Queue
对象选项block=False
来解决。你知道吗不能将tkinter对象传递给其他进程。在
StringVar
的情况下,只能发送管道中变量的值(例如:txt2go.get()
),而不能发送变量本身(例如:txt2go
)。你知道吗相关问题 更多 >
编程相关推荐