Python: threads can only be started once

You should start only new threads in your getresults

threads = []

def getresults(seed):
  local_threads = []
  for link in links:
      t = threading.Thread(target=getLinkResult, args = (suggestengine, seed))
      local_threads.append(t)
      threads.append(t)
  for thread in local_threads:
      thread.start()

for seed in tqdm:
  getresults(seed + a)
  getresults(seed + b)

for thread in threads:
        thread.join()

Fastest way, but not the brightest (general problem):

from tkinter import *
import threading, time

def execute_script():
    def sub_execute():
        print("Wait 5 seconds")
        time.sleep(5)
        print("5 seconds passed by")
    threading.Thread(target=sub_execute).start()

root = Tk()
button_1 = Button(master=root, text="Execute Script", command=execute_script)
button_1.pack()
root.mainloop()

You are calling getresults twice, and both times, they reference the same global threads list. This means, that when you call getresults for the first time, threads are started.

When you call them for the second time, the previous threads that are already running, have the .start() method invoked again.

You should start threads in the getresults as local threads, and then append them to the global threads list.

Although you can do the following:

for thread in threads:
    if not thread.is_alive():
        thread.start()

it does not solve the problem as one or more threads might've already ended and therefore be started again, and would therefore cause the same error.