Python多处理和tkinter-如何连接此进程(GUI和衍生进程)?

Python多处理和tkinter-如何连接此进程(GUI和衍生进程)?,python,multithreading,user-interface,tkinter,Python,Multithreading,User Interface,Tkinter,很久以前,我开始使用线程。我的GUI中任何函数的线程。但上一次我重点讨论了多处理模块。这里的问题是,当我生成新进程时,我不知道如何与GUI连接。 下面是示例代码-一个按钮“执行”线程,它按预期工作。 第二个按钮生成过程,但我的GUI未更新(输入字段未填充文本)。 如何解决这个问题? 如何从流程接收“打印”语句? 谢谢 使用进程生成时,子进程无法更新父进程的变量。 您可以通过修改代码进行实验: inputEn.pack() globalv = 0 def runner(txt): glo

很久以前,我开始使用线程。我的GUI中任何函数的线程。但上一次我重点讨论了多处理模块。这里的问题是,当我生成新进程时,我不知道如何与GUI连接。 下面是示例代码-一个按钮“执行”线程,它按预期工作。 第二个按钮生成过程,但我的GUI未更新(输入字段未填充文本)。 如何解决这个问题? 如何从流程接收“打印”语句? 谢谢


使用进程生成时,子进程无法更新父进程的变量。 您可以通过修改代码进行实验:

inputEn.pack()
globalv = 0

def runner(txt):
    global globalv
    print("runner")
    time.sleep(5)
    # this doesn't work when I use it with Process
    inputEn.insert(0, "{}".format(txt))
    globalv = globalv + 1
    print 'globalv : ', globalv
然后,当通过线程调用runner时,globalv将被更新,而当通过进程调用runner时,globalv将不被更新。 您必须使用队列使子对象与您的应用程序交互


这是因为子进程使用父进程上下文的副本实例化,而线程使用与父进程相同的上下文

您还没有说明为什么这里需要多处理。如果只想更新变量,tkinter的after()可以很好地实现这一点。一个不那么优雅的例子

import Tkinter as tk
import random

class UpdateLabel(object):
    def __init__(self, master):
        self.master=master
        self.str_var=tk.StringVar()
        self.str_var.set("start")
        tk.Entry(root, textvariable=self.str_var, width=50).pack()

        tk.Button(self.master, text="Exit", bg="orange",
                  command=self.master.quit).pack()

        self.ctr=0
        self.change_it()

    def change_it(self):
        """ use random to simulate getting some kind of data 10 times
        """
        this_lit=self.str_var.get()
        next_lit=random.choice(range(100))
        self.str_var.set(this_lit+", "+str(next_lit))
        self.ctr += 1
        if self.ctr < 10:
            self.master.after(500, self.change_it)

root = tk.Tk()
UL=UpdateLabel(root)
root.mainloop()
将Tkinter作为tk导入
随机输入
类UpdateLabel(对象):
定义初始(自我,主):
self.master=master
self.str_var=tk.StringVar()
self.str_变量集(“开始”)
Entry(root,textvariable=self.str_var,width=50).pack()
按钮(self.master,text=“退出”,bg=“橙色”,
command=self.master.quit).pack()
self.ctr=0
self.change_it()
def更改(自身):
“”“使用random模拟10次获取某种数据
"""
this\u lit=self.str\u var.get()
next_lit=random.choice(范围(100))
self.str变量集(此变量集+”,“+str(下一个变量集))
self.ctr+=1
如果self.ctr<10:
self.master.after(500,self.change_它)
root=tk.tk()
UL=更新标签(根)
root.mainloop()
import Tkinter as tk
import random

class UpdateLabel(object):
    def __init__(self, master):
        self.master=master
        self.str_var=tk.StringVar()
        self.str_var.set("start")
        tk.Entry(root, textvariable=self.str_var, width=50).pack()

        tk.Button(self.master, text="Exit", bg="orange",
                  command=self.master.quit).pack()

        self.ctr=0
        self.change_it()

    def change_it(self):
        """ use random to simulate getting some kind of data 10 times
        """
        this_lit=self.str_var.get()
        next_lit=random.choice(range(100))
        self.str_var.set(this_lit+", "+str(next_lit))
        self.ctr += 1
        if self.ctr < 10:
            self.master.after(500, self.change_it)

root = tk.Tk()
UL=UpdateLabel(root)
root.mainloop()