Запустите два скрипта одновременно в tkinter - PullRequest
1 голос
/ 18 февраля 2020

Мне нужно два скрипта, два запускаются одновременно по нажатию одной кнопки. Невозможно использовать две кнопки, потому что gui зависает после первого нажатия кнопки и ожидает завершения первой программы до sh. Вот код:

import tkinter
import os
import subprocess

window = tkinter.Tk()
window.title("GUI")

def clicked():
     os.system('python inference.py')
     os.system('python extract_frames.py')

    # I used the subprocess approach also but it still waits for the first program to finish

    subprocess.run("python inference.py  & python extract_frames.py",shell=True)


bt = tkinter.Button(window,text="Click Here to start detecting",command=clicked).pack()

window.geometry('400x400')
window.mainloop()

Ответы [ 3 ]

1 голос
/ 18 февраля 2020

Попробуйте настроить его следующим образом:

import tkinter
import os
from subprocess import call
import threading

window = tkinter.Tk()
window.title("GUI")

def clicked():
    #os.system('python inference.py')
    #os.system('python extract_frames.py')

    # I used the threading approach 

    threading.Thread(target=call, args=("python inference.py" ,), ).start()
    threading.Thread(target=call, args=("python extract_frames.py" ,), ).start()



bt = tkinter.Button(window,text="Click Here to start detecting",command=clicked).pack()

window.geometry('400x400')
window.mainloop()

0 голосов
/ 18 февраля 2020

Вы можете использовать два subprocess.Popen(...) для запуска двух сценариев в отдельных процессах:

import subprocess
import tkinter as tk

proclist = []

def clicked():
    proclist.clear()
    for script in ('inference.py', 'extract_frames.py'):
        proc = subprocess.Popen(['python', script])
        proclist.append(proc)

def kill_tasks():
    for proc in proclist:
        if proc and proc.poll() is None:
            print('Killing process with PID', proc.pid)
            proc.kill()
    proclist.clear()

root = tk.Tk()
root.geometry('400x400')
root.title('GUI')

tk.Button(root, text='Start detecting', width=20, command=clicked).pack()
tk.Button(root, text='Kill tasks', width=20, command=kill_tasks).pack()

root.mainloop()
0 голосов
/ 18 февраля 2020

Ваш код будет выглядеть примерно так. Это простая реализация.

from threading import Thread
import tkinter
import os
import subprocess

window = tkinter.Tk()
window.title("GUI")
def fun1():
     os.system('python inference.py')
def fun2():
     os.system('python extract_frames.py')


def clicked():
     Thread(target = fun1).start() 
     Thread(target = fun2).start()


bt = tkinter.Button(window,text="Click Here to start detecting",command=clicked).pack()

window.geometry('400x400')
window.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...