Запуск другого python скрипта с использованием tkinter - PullRequest
0 голосов
/ 19 марта 2020

Я создал GUI с помощью tkinter, я хочу, чтобы при открытии GUI запускался другой скрипт python. Это пример кода для того, что я сделал до сих пор.

window = Tk()
window.configure(bg='#101d25')
window.maxsize(width=580, height=450)
window.minsize(width=580, height=450)

title = Label(window, text='Face clustering', bg='#232d36', fg='#979ca0', font=('Ink Free', 30, 
'bold'))
title.pack(side=TOP, fill=X)

process_label = Label(window, text='Processing files', fg='#979ca0', bg='#101d25', font=('Ink Free', 
14, 'bold'))
process_label.place(x=70, y=150)

style = ttk.Style()
style.theme_use('clam')
TROUGH_COLOR = '#101d25'
BAR_COLOR = '#979ca0'
style.configure("red.Horizontal.TProgressbar", troughcolor=TROUGH_COLOR, bordercolor=TROUGH_COLOR,
            background=BAR_COLOR, lightcolor=BAR_COLOR, darkcolor=BAR_COLOR)
progress_bar = ttk.Progressbar(window, style="red.Horizontal.TProgressbar", orient=HORIZONTAL, 
length=300,mode="determinate")
progress_bar.place(x=50, y=200)
progress_bar.start()
os.system('python sample.py')
progress_bar.stop()
window.mainloop()

Я хочу, чтобы индикатор выполнения работал до тех пор, пока sample.py не завершит его выполнение. Файл выполняется, но GUI не отображается. Надеясь на решение.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 19 марта 2020

Я не знаю точно, сможет ли os.system уведомить вас, когда ваш скрипт будет выполнен, или нет, но, возможно, вы могли бы попробовать и использовать метод after. Я приложу пример из GUI, который я написал некоторое время go.

def checkForComplete(self):
    print(self.createStatus)
    if self.createStatus == "notStarted":
        self.createStatus = "started"
        self.progressbar.configure(style = "green.Horizontal.TProgressbar")
        self.progressbar.start()
        self.after(100, self.checkForComplete)
    elif self.createStatus == "succes":
        self.progressbar.stop()
        self.createStatus = "notStarted"
        self.progressbar['value'] = 200
        self.progressbar.update_idletasks()
    elif self.createStatus == "fail":
        self.progressbar.stop()
        self.createStatus = "notStarted"
        self.progressbar.configure(style = "red.Horizontal.TProgressbar")
        self.progressbar['value'] = 200
        self.progressbar.update_idletasks()
    else: #its started, that means we are waiting for the action to complete
        self.after(100, self.checkForComplete)
0 голосов
/ 19 марта 2020

Вам нужно запустить скрипт в другом потоке:

import threading

...

progress_bar.place(x=50, y=200)

def run_script():
    progress_bar.start()
    os.system('python sample.py')
    progress_bar.stop()

threading.Thread(target=run_script, daemon=True).start()

window.mainloop()

Если основной кодовый блок находится внутри функции в sample.py, например, main(), то лучше импортировать функцию и вызовите функцию напрямую:

import threading
from sample import main

...

def run_it():
    progress_bar.start()
    main()
    progress_bar.stop()

threading.Thread(target=run_it, daemon=True).start()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...