Rozpocznij / zatrzymaj pętlę czasu?

Próbuję napisać program, który tworzy listę wszystkich plików .xml w folderze, a następnie kopiuje je do innego katalogu i usuwa z oryginalnego katalogu. Ta część programu działa dobrze. Chcę to zrobić, abym mógł kliknąć przycisk w interfejsie GUI i skanować i przetwarzać foldery do momentu naciśnięcia przycisku, aby go wyłączyć. Ponownie, włączenie go nie jest problemem, ale próba jego zatrzymania mnie zakłopotała. Chciałbym, żeby poczekał jakiś czas między nimi, ale użycie time.sleep (x) zamrozi cały program i nie pozwoli mi na wprowadzanie kolejnych komend, dopóki nie przestanie działać, tylko po to, aby przetworzyć, a następnie ponownie zasnąć. Wszelkie sugestie, jak zasadniczo uruchomić / zatrzymać pętlę while z przycisku GUI tkinter?

Kod jest poniżej:

#! python3
import glob
import time
import shutil
import os
import sys
import datetime
import errno
import re
import fnmatch
import tkinter # copy tcl8.5 and tk8.5 to folder
from tkinter import ttk
import sched



flag = 0

with open("config.ini") as f:
    g = f.readlines()
    sourcedir = g[0][10:-1]
    ICdir = g[1][13:-1]
    BUdir = g[2][13:-1]
    LOGdir = g[3][8:-1]
    el = g[4][3:-1]

# reads directories from config.ini

h = len(sourcedir)
# obtains length of address, used later on

def exemel():
    m = sorted(glob.glob(sourcedir+"/*.xml"), key=os.path.getmtime)
    n = len(m)
    if n == 0:
        print("none left")
    for item in range(n):
        try:
            m = sorted(glob.glob(sourcedir+"/*.xml"), key=os.path.getmtime)
            n = len(m)
            if n == 0:
                print("none left")
            global flag
            if flag == 5:
                flag = 0
                item = item + 1
            with FileLock(m[item]):
                k = h - len(m[item])
                g = m[item][k:] 
                shutil.copy(m[item], ICdir)
                shutil.move(m[item], BUdir)
                print(m[item] + " successfully processed.")
                dated = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
                if os.path.exists(LOGdir):
                    with open(LOGdir, "a") as logging:
                        logline = '\n' + '"' + g[1:] + '", #' + dated + "# copied"
                        logging.write(logline)
                else:
                    with open(LOGdir, "w") as logging:
                        logline = '"' + g[1:] + '", #' + dated + "# copied"
                        logging.write(logline)


        except PermissionError:
            print("File in use, waiting..")
            time.sleep(1.5)
            flag += 1
            continue
        except shutil.Error as e:
            os.remove(ICdir + g)
            os.remove(BUdir + g)
            print("Existing files removed..")
            dated = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            if el == "1":
                if os.path.exists(LOGdir):
                    with open(LOGdir, "a") as logging:
                        logline = '\n' + '"' + g[1:] + '", #' + dated + "# overwritten"
                        logging.write(logline)
                else:
                    with open(LOGdir, "w") as logging:
                        logline = '"' + g[1:] + '", #' + dated + "# overwritten"
                        logging.write(logline)
        except IndexError:
            item = 0
            continue
        except SystemExit:
            break
        except KeyboardInterrupt:
            break



def prunt():
    print("ZES")


def config():
    print("config")

def stop():
    print("stop")
    global x
    x = False
    global STOP
    STOP = True



s = sched.scheduler(time.time, time.sleep)

def run_periodically(start, end, interval, func):
    event_time = start
    while event_time < end:
        s.enterabs(event_time, 0, func, ())
        event_time += interval
    s.run()


def starter():
    run_periodically(time.time(), time.time()+600, 60, exemel)



### GUI BEGIN ###


root = tkinter.Tk()
root.title("XML Wizard")

mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=("N","W", "E", "S"))
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)


sourceEntry = ttk.Entry(mainframe, width=50, textvariable=sourcedir)
sourceEntry.grid(column=2, row = 1, columnspan=2)
ttk.Label(mainframe, text="Source Directory:").grid(column=1, row=1, sticky="W")

BackupEntry = ttk.Entry(mainframe, width=50, textvariable=BUdir)
BackupEntry.grid(column=2, row = 2, columnspan=2)
ttk.Label(mainframe, text="Backup Directory:").grid(column=1, row=2, sticky="W")

ImportEntry = ttk.Entry(mainframe, width=50, textvariable=ICdir)
ImportEntry.grid(column=2, row = 3, columnspan=2)
ttk.Label(mainframe, text="Import Directory:").grid(column=1, row=3, sticky="W")

ttk.Button(mainframe, text="Go", command=starter).grid(column=4, row=5, sticky="W")
ttk.Button(mainframe, text="Save Config", command=config).grid(column=5, row=4, sticky="W")
ttk.Button(mainframe, text="Load Config", command=config).grid(column=5, row=3, sticky="W")
ttk.Button(mainframe, text="Stop", command=stop).grid(column=3, row=5, sticky="W")

root.mainloop()

Funkcja FileLock została znaleziona tutaj i działa idealnie, jeśli się zastanawiasz, ale zostawiłem to dla przestrzeni / czytelności. Wiem, że mój kod jest niechlujny, ale dopiero zacząłem programować.

Wszelkie zalecenia / alternatywne metody są bardzo mile widziane!

btw: exemel to funkcja, którą chcę zapętlić!

questionAnswers(1)

yourAnswerToTheQuestion