Python. Остановка функции из другой

Недавно начал писать на питоне. В интернете так и не нашел похожего примера. Вообщем есть функция с ее выполнением и есть другая при запуске которой Первая должна остановиться. Как я понял при запуске функции она Создается и при запуске еще раз Создается еще и т.д., а как их удалить я так и не понял и не нашел. Просьба помочь разобраться. Спасибо

Пример кода(Исправил*):

from random import*
from tkinter import*
WIDTH = 800
HEIGHT = 600
SEG_SIZE = 20
IN_GAME = True


def rect(x, y):
    pic.create_rectangle(x, y, x + 20, y + 20,
        fill='lightgreen', outline='white', width=2)

def eat(x, y):
        pic.create_rectangle(x, y, x + 20, y + 20,
            fill='black')
        pic.create_oval(x, y, x + 20, y + 20,
            fill='red', outline='yellow', width=2)

def com(event):
    if event.keysym == "Up" or event.keysym == "w":
        MOVE.move_up()
    if event.keysym == "Down" or event.keysym == "s":
        MOVE.move_down()
    if event.keysym == "Left" or event.keysym == "a":
        MOVE.move_left()
    if event.keysym == "Right" or event.keysym == "d":
        MOVE.move_right()

Amount = 0
def con():
    global Amount
    Amount += 10
    text1.config(text='Amount rect = ' + str(Amount))
    i = 0
    while i < 10:
        x = randint(0, 380)
        y = randint(0, 380)
        rect(x, y)
        i += 1

win = Tk()
win.title("Snake")
win.config(bg='grey')
win.bind("<Key>", com)

text1 = Label(win, text='Amount rect = ' + str(0), fg='yellow', bg='black')
text1.place(x=200, y=10)
text1.config(font=('verdana', 20))

pic = Canvas(win)
pic.config(width=WIDTH, height=HEIGHT, bg="#003300")
pic.grid(row=1, column=0)
pic.focus_set()

but = Button(height=2, width=20, bg='green', bd=4)
but.grid(row=2, column=0)
but.config(command=con)

had = pic.create_rectangle(20, 20, 20 + 20, 20 + 20, fill='white')

class MOVE():
    def move_start():
        pic.move(had, 20, 0)
        pic.after(300, MOVE.move_start)
    def move_up():
        pic.move(had, 0, -20)
        if MOVE.move_down==True or MOVE.move_left==True or MOVE.move_right==True:
            return
        pic.after(300, MOVE.move_up)
    def move_down():
        pic.move(had, 0, 20)
        if MOVE.move_up==True or MOVE.move_left==True or MOVE.move_right==True:
            return
        pic.after(300, MOVE.move_down)
    def move_left():
        pic.move(had, -20, 0)
        if MOVE.move_down==True or MOVE.move_up==True or MOVE.move_right==True:
            return
        pic.after(300, MOVE.move_left)
    def move_right():
        pic.move(had, 20, 0)
        if MOVE.move_down==True or MOVE.move_left==True or MOVE.move_up==True:
            return
        pic.after(300, MOVE.move_right)



win.mainloop()
#a.create_text(x,y,x1,y1)   Рисует текст, центрируя его по точке (x,y) и (x1,y1), на полотне a.

If тут просто для теста, потому что он тоже не помог)

Есть объект "Голова", который двигается с помощью WASD или стрелок. Функции движения запускаются, но остановить как не знаю. И при каждом последующем нажатии функция создается вновь и ускоряет объект в нажатую сторону.


Ответы (1 шт):

Автор решения: Alexey Epsilon

Вообщем переосмыслив поставленную перед собой задачу движения объекта. Написал код таким образом:

from random import*
from tkinter import*
WIDTH = 800
HEIGHT = 600
SEG_SIZE = 20
IN_GAME = True
move = "Right"

vector = {"Down": (0, 20), "Right": (20, 0),
           "Up": (0, -20), "Left": (-20, 0)}

def com(event):
    global move
    if event.keysym == "Up" or event.keysym == "w":
        move = "Up"
        print(vector[move])
    if event.keysym == "Down" or event.keysym == "s":
        move = "Down"
        print(vector[move])
    if event.keysym == "Left" or event.keysym == "a":
        move = "Left"
        print(vector[move])
    if event.keysym == "Right" or event.keysym == "d":
        move = "Right"
        print(vector[move])

def Move():
    global move
    x, y = vector[move]
    print(x, y)
    pic.move(had, x, y)
    pic.after(300, Move)

win = Tk()
win.title("Snake")
win.config(bg='grey')
win.bind("<Key>", com)

text1 = Label(win, text='Amount rect = ' + str(0), fg='yellow', bg='black')
text1.place(x=200, y=10)
text1.config(font=('verdana', 20))

pic = Canvas(win)
pic.config(width=WIDTH, height=HEIGHT, bg="#003300")
pic.grid(row=1, column=0)
pic.focus_set()

had = pic.create_rectangle(SEG_SIZE, SEG_SIZE,
    SEG_SIZE + SEG_SIZE, SEG_SIZE + SEG_SIZE, fill='white')

print(vector[move])

but = Button(height=2, width=20, bg='green', bd=4)
but.grid(row=2, column=0)
but.config(command=Move)

win.mainloop()

Есть объект, который должен двигаться постоянно в одну из четырех сторон. Создал словарь, в который написал координаты движения в стороны, и при нажатии на одну из клавиш получаем значение стороны, присваиваем значения к ху и записываем в движение. Работает вроде не плохо, дальше подкорректирую, но в вопрос остался без ответа.

Как отменять запущенные функции. С помощью Декораторов можно менять состав функции, наверно все таки это выход из ситуации, но нужно разобраться. Если кто напишет, как остановить уже выполняющуюся функцию на примере движения, был бы очень благадарен!)

→ Ссылка