Вы не можете остановить каждый оператор рисования, если вы не поставите флажок между каждой нарисованной линией.
Приведенный ниже код представляет собой грубый макет того, как вы могли бы сделать что-то, чтобы проверить переменную отслеживания, используемую, чтобы сказать ей больше не рисовать новые линии.
Самое близкое, что вы можете сделать, чтобы прекратить рисовать, это что-то вроде этого:
import turtle
import tkinter as tk
def start():
global tracker
tracker = False
if tracker == False:
t.forward(100)
if tracker == False:
t.right(90)
if tracker == False:
t.forward(100)
if tracker == False:
t.left(90)
if tracker == False:
t.forward(100)
if tracker == False:
t.right(90)
if tracker == False:
t.forward(100)
if tracker == False:
t.right(90)
if tracker == False:
t.forward(100)
def stop():
global tracker
tracker = True
def clear():
canvas.delete("all")
root = tk.Tk()
tracker = False
canvas = tk.Canvas(width = 500, height = 500)
canvas.pack()
t = turtle.RawTurtle(canvas)
tk.Button(text = "Start", command = start).pack(side = tk.LEFT)
tk.Button(text = "Stop", command = stop).pack(side = tk.LEFT)
tk.Button(text = "Clear", command = clear).pack(side = tk.LEFT)
root.mainloop()
Это по крайней мере остановит рисование после каждой линии, но вы не можете остановить рисование в средней линии.
Просто для удовольствия, если мы добавим некоторые отслеживающие переменные и используем более чистую логику, мы можем запускать, останавливать и запускать снова.
Обновление: из комментария @ cdlane ниже я добавил отслеживание добавления и обновил функцию очистки. Это должно позволять запуск, запуск, запуск без проблем, а также возможность очистки поля.
import turtle
import tkinter as tk
def start(turtle_object, draw_path):
global tracker, start_ndex, end_ndex, started
tracker = False
if started == False:
started = True
for i in range(start_ndex, end_ndex):
if tracker == False and i <= end_ndex:
pth = draw_path[i]
if pth[0] == "f":
turtle_object.forward(pth[1])
elif pth[0] == "r":
turtle_object.right(pth[1])
elif pth[0] == "l":
turtle_object.left(pth[1])
start_ndex += 1
def stop():
global tracker, started
tracker = True
started = False
def clear():
global t, tracker, started, start_ndex
canvas.delete("all")
tracker = False
start_ndex = 0
started = False
t = turtle.RawTurtle(canvas)
root = tk.Tk()
tracker = False
start_ndex = 0
started = False # added this tracking variable to prevent issues with spamming the start button.
draw_path = [["f", 100], ["r", 90], ["f", 100], ["l", 90], ["f", 100], ["r", 90], ["f", 100], ["r", 90], ["f", 100]]
end_ndex = len(draw_path)
canvas = tk.Canvas(width = 500, height = 500)
canvas.pack()
t = turtle.RawTurtle(canvas)
tk.Button(text = "Start", command = lambda: start(t, draw_path)).pack(side = tk.LEFT)
tk.Button(text = "Stop", command = stop).pack(side = tk.LEFT)
tk.Button(text = "Clear", command = clear).pack(side = tk.LEFT)
root.mainloop()