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



我想用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()

问题似乎出在停止方法中。

我想我可能知道问题是什么,但我不是100%确定。原因的答案似乎在python文档中。这里的代码运行良好(我编辑了语法并将tkk用于按钮,看起来更好(:

from tkinter import *
from tkinter import ttk
import multiprocessing

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

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

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

def stop():
    process1.kill()
    process2.kill() 

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 = ttk.Button(app, text="Start", command=start)
    stop = ttk.Button(app, text="Stop", command=stop)
    start.grid(padx=15, pady=20)
    stop.grid(column=1, row=0)
    root.mainloop()
    process1.join()
    process2.join()

希望这有帮助!

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

这意味着您的:

global a

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

您可以跨进程共享变量。 有两种方法可以做到这一点:通过Manager实例或通过共享内存。 共享内存效率更高,但更难使用,并且有时具有操作系统依赖项,因此,如果您不需要特别高的性能,请考虑使用 Manager。

相关内容

  • 没有找到相关文章

最新更新