I am trying to write a program that makes a list of all .xml files in a folder, and then copies them to another directory and removes it from the source directory. This part of the program is working fine. I want to make it so that I can click a button in the GUI, and scan and process folders until I click a button to disable it. Again, turning it on is not a problem, but trying to stop it puzzled me a lot. I would like him to wait a while between them, but using time.sleep (x), he freezes the entire program and does not allow me to enter more commands until he stops sleeping, just so that they are processed and then sleep again. Any suggestions on how to essentially start / stop the while loop using the tkinter GUI button?
Code below:
#! 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()
The FileLock function was found here and works great if you're interested, but I left it for space / readability. I know my code is messy, but I just started programming.
Any recommendations / alternative methods are very welcome!
btw: elementel is the function I want to use for the loop!