Threading with tkinter - Как прекратить работу скрипта при нажатии кнопки во время работы функции? - PullRequest
0 голосов
/ 07 марта 2019

Я нахожусь в Python37, на windows 10, работаю в tkinter, и я написал функцию did_file_update, которая постоянно сканирует рабочий стол каждые 10 секунд, чтобы увидеть, изменился ли файл "test.txt". Также есть функция abort_window_call, которая создает окно с красной кнопкой «ABORT». Я пытаюсь написать сценарий, который объединит две функции и позволит мне нажать кнопку «ABORT» и завершить выполнение сценария после нажатия кнопки «START» и вызова did_file_update.

import os
import time
import threading
import tkinter as tk
from tkinter import messagebox
import tkinter.messagebox as msg
from tkinter import Button, Message, Tk


global path_to_watch
path_to_watch = "C:\\Users\\Desktop"

class App():
    def __init__(self):
        pass

    def abort_window_call(self):
        abort_window = Tk()
        abort_window.title("Would you like to abort?")
        abort_window.geometry('50x90+200+200')
        abort_button = tk.Button(abort_window, text='ABORT', font=('century gothic', 24),
                        bg='red', fg='white', height=1, width=5,
                        relief='raised', command=lambda: abort_window.destroy())
        abort_button.pack(padx=10, pady=5)

        abort_window.mainloop()

    def did_file_update(self):
        statinfo_before = os.stat("C:\\Users\\Desktop\\test.txt")
        statinfo_size_before = statinfo_before.st_size

        while 1:
            time.sleep (10)
            statinfo_after = os.stat("C:\\Users\\Desktop\\test.txt")
            statinfo_size_after = statinfo_after.st_size
            if statinfo_size_after != statinfo_size_before:
                print("Updated: test.txt")
                statinfo_size_before = statinfo_size_after
                break
            else:
                pass

    def main(self):
        master = Tk()
        ws = master.winfo_screenwidth()
        hs = master.winfo_screenheight()
        x = (ws/2) - (180)
        y = (hs/2) - (70)
        master.title("File Update")
        master.geometry('360x140+%d+%d' % (x, y))
        msg = Message(master, text = "FILE UPDATE", width=700)
        msg.config(font=('century gothic', 28))
        msg.grid(row=3, column=0)

        start_button = tk.Button(master, text='START', font=('century gothic', 24),
                        bg='green', fg='white', height=1, width=17,
                        relief='raised', command=self.did_file_update)
        start_button.grid(row=1, column=0, sticky='n', padx=10, pady=5)

        master.mainloop()

app=App()

t = threading.Thread(target = app.abort_window_call)
t1 = threading.Thread(target = app.main)

t.start()
t1.start()

tl; dr Как заставить функцию abort_window_call завершить всю программу, даже после нажатия кнопки «START» и запуска функции did_file_update?

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