如何在Python中使用tkinter按钮终止两个进程

时间:2019-06-02 09:07:57

标签: python python-3.x tkinter multiprocessing

我想用python脚本创建两个进程。需要通过tkinter按钮启动和停止这些过程。进程正确启动,但不能终止。用tkinter按钮正确终止进程的最简单方法是什么? 哪种最佳做法?

from tkinter import *
import multiprocessing

def print1():
    global a
    while a == True:
        print('im process 1')

def print2():
    global a
    while a == True:
        print('im process 2')

def start():
    process1.start()
    process2.start()

def stop():
    global a
    a = False

a = True

if __name__ == '__main__':

    process1 = multiprocessing.Process(target = print1)
    process2 = multiprocessing.Process(target = print2)

    root = Tk()
    root.title("Title")
    root.geometry("200x200")

    app = Frame(root)
    app.grid()

    start = Button(app, text="Start", command=start)
    stop = Button(app, text="Stop", command=stop)
    start.grid()
    stop.grid()
    root.mainloop()
    process1.join()
    process2.join()

2 个答案:

答案 0 :(得分:1)

multiprocessing.Process的实例之间共享普通变量。

这意味着您:

global a

是每个进程中的不同全局变量,与主Python程序中的第三 global a分开。因此,当您使用tk按钮将最后一个a设置为False时,通过a记住的process1仍然是Truea在通过process2记住的过程中。

可以在各个进程之间共享变量。有两种方法可以执行此操作:通过Manager instances或通过共享内存。共享内存效率更高,但更难使用,并且有时具有操作系统依赖性,因此,如果您不需要特别高性能,请考虑使用Manager。

答案 1 :(得分:0)

问题似乎出在stop方法上。

我想我可能知道问题出在哪里,但我不确定100%。原因的答案似乎在python文档中。这段代码运行良好(我编辑了语法,并在按钮上使用了ResultSet,看起来更好):

tkk

希望这会有所帮助!