Tkinter和通过管道发送StringVar

2024-03-28 11:23:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近开始玩进程。为了尝试一些东西,我编写了一个非常简单的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

这是什么意思,你能提出一些解决办法吗?你知道吗


Tags: inpyselfsend进程libusrline
2条回答

我的问题是我无法触发GUI进行自我更新。然而,{cd2}是一个研究对象,其中cd1是在cd2之后发现的。要触发更改,必须使用while 1:循环更新内容,而不是使用mainloop()。你知道吗

而且,Python似乎更多地使用了队列而不是管道。使用管道进行异步进程间通信很困难,因为进程被.recv()调用阻塞,直到有内容可读取。对于队列,这个问题可以通过Queue对象选项block=False来解决。你知道吗

不能将tkinter对象传递给其他进程。在StringVar的情况下,只能发送管道中变量的值(例如:txt2go.get()),而不能发送变量本身(例如:txt2go)。你知道吗

相关问题 更多 >