簡體   English   中英

在 tkinter 中同時運行兩個腳本

[英]Run two scripts simultaneously in tkinter

我需要兩個腳本同時單擊一個按鈕同時運行。 無法使用兩個按鈕,因為在單擊第一個按鈕后 gui 會凍結並等待第一個程序完成。 這是代碼:

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()

嘗試這樣調整它:

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()

你的代碼看起來像這樣。它只是一個簡單的實現。

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()

您可以使用兩個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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM