Я просто запустил, а ты смотри потом, как запомнить нажатие кнопки, чтобы не запускать тред повторно.
#!/usr/bin/env python3
from tkinter import *
from time import sleep
from threading import Thread
root = Tk()
root.title ('Многопоточность')
c = Canvas(width=2250, height=2250, bg='green')
c.pack()
treug = c.create_polygon(110, 110, 110, 160, 150, 135)
krug = c.create_oval(40, 140, 100, 200)
def dvig1():
c.move(treug, -1, 0)
c.update()
def dvig2():
c.move(krug, 1, 0)
c.update()
def runner():
root.after(1000, lambda: (dvig1(), dvig2()))
def thread():
while True:
runner()
sleep(0.02)
def run_thread(event):
th = Thread(target=thread)
th.daemon = True
th.start()
c.bind("<ButtonPress-1>", run_thread)
root.mainloop()
А это - чисто по времени посмотреть, сколько они могут двигаться (бесконечно или это выпадает из-за рекурсии или другого переполнения).
#!/usr/bin/env python3
from tkinter import *
from time import sleep
from threading import Thread
root = Tk()
root.title ('Многопоточность')
c = Canvas(width=2250, height=2250, bg='green')
c.pack()
treug = c.create_polygon(110, 110, 110, 160, 150, 135)
krug = c.create_oval(40, 140, 100, 200)
def dvig1(n):
step = -1 if n < 50 else 1
c.move(treug, step, 0)
c.update()
def dvig2(n):
step = 1 if n < 50 else -1
c.move(krug, step, 0)
c.update()
def runner(n):
root.after(1000, lambda: (dvig1(n), dvig2(n)))
def thread():
n = 0
while True:
runner(n % 100)
sleep(0.02)
n += 1
def run_thread(event):
th = Thread(target=thread)
th.daemon = True
th.start()
c.bind("<ButtonPress-1>", run_thread)
root.mainloop()