Как завершить два процесса с помощью кнопки tkinter в Python - PullRequest
1 голос
/ 02 июня 2019

Я хочу создать два процесса с помощью скрипта 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 ]

1 голос
/ 04 июня 2019

Обычные переменные не совместно используются экземплярами multiprocessing.Process.

Это означает, что вы:

global a

- это различная глобальная переменная в каждом процессе, отдельная от третьего global a в вашей основной программе Python. Поэтому, когда вы используете кнопку tk, чтобы установить для последнего a значение False, a в процессе, запомненном через process1, по-прежнему True, как и a в процессе, запомненном через process2.

Вы можете совместно использовать переменные между процессами. Есть два способа сделать это: через Manager экземпляры или через общую память. Совместно используемая память более эффективна, но более сложна в использовании и иногда имеет зависимости от ОС, поэтому, если вам не требуется особо высокая производительность, рассмотрите возможность использования Manager.

0 голосов
/ 02 июня 2019

Проблема, похоже, заключается в методе остановки.

Я думаю, я мог бы знать, в чем проблема, но я не уверен на 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()

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...