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

标签 python multithreading user-interface tkinter

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

import tkinter as tk
import time
from multiprocessing import Process, Pool
from threading import Thread


root = tk.Tk()
inputEn = tk.Entry(root)
inputEn.pack()


def runner(txt):
    print("runner")
    time.sleep(5)
    # this doesn't work when I use it with Process
    inputEn.insert(0, "{}".format(txt))
    print("runner end")


def process():
    p = Process(target=runner, args=("process",))
    p.start()


def thread():
    p = Thread(target=runner, args=("thread",))
    p.start()



btnStart = tk.Button(root, text="Start Process", command=process)
btnStart.pack()

btnStart2 = tk.Button(root, text="Start Thread", command=thread)
btnStart2.pack()



if __name__=="__main__":
    root.mainloop()

最佳答案

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

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 不会更新。 您必须使用队列来让子进程与您的应用程序交互。

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

关于Python 多处理和 tkinter - 如何连接此进程(GUI 和衍生进程)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33980097/

相关文章:

c++ - 你能通过保证多个线程不会访问同一个内存来避免锁定吗?

iphone - 如何在 iOS 上取消 applicationDidEnterBackground 中的工作线程

python - Odoo 报告字段数据在预期时为 "Undefined"False

c# - ConcurrentQueue 一个元素被两个线程取走

java - 将迭代器转换为流并调用并行,转换是否在共享线程池线程上完成?

java - 创建 JTable 的 Junit 测试是否良好?

java - Swing 中的组件具体什么时候实现的

python - 有没有办法在 django 中的静态资源末尾附加 etag

python - 使用相同的 boolean 值初始化列表

python - 在Python中查找多个重叠矩形的交集区域