title: Start/stop a while loop?
body: <p>I'm trying to write a program that makes a list of all .xml files in a folder, then copies them to another directory and deletes from the original directory. This part of the program works fine. I want to make it so that I can click a button in the GUI and have it scan and process folders until I press a button to turn it off. Again, turning it on is not a problem, but trying to stop it has me stumped. I'd like it to wait some time in between but using time.sleep(x) freezes the entire program and doesn't let me input any more commands until it's stopped sleeping, only for it to process and then sleep again. Any suggestions on how to essentially start/stop a while loop from a GUI tkinter button?</p>
  
  <p>Code is below:</p>
  
  <pre><code>#! 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 &lt; 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()
  </code></pre>
  
  <p>FileLock function was found on here and works perfectly if you're wondering but I left it out for space/readibility. I know my code is sloppy but I've only just begun programming.</p>
  
  <p>Any recommendations/alternate methods are very welcome!</p>
  
  <p>btw: exemel is the function that I want to loop!</p>