"Stop" Tkinter 中的按钮
"Stop" Button in Tkinter
我正在尝试让海龟动画以一个按钮开始并以一个按钮停止。从按钮开始很容易,但我似乎无法找出停止按钮?到目前为止,这是我的代码:
import turtle
import tkinter as tk
def start():
t.forward(100)
t.right(90)
t.forward(100)
t.left(90)
t.forward(100)
t.right(90)
t.forward(100)
t.right(90)
t.forward(100)
def stop():
t.stop
def clear():
canvas.delete("all")
root = tk.Tk()
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()
清除按钮也能用,但之后开始按钮就失效了。如果有人也可以帮助我。
感谢@Mike - SMT 帮助我编写此代码。这是经过编辑且功能齐全的代码:
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
running = True
def stop():
global tracker, started
tracker = True
started = False
def clear():
global t, tracker, started, start_ndex
t.reset()
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()
除非在绘制的每条线之间提供检查器,否则无法停止每个绘制语句。
下面的代码只是一个粗略的模型,展示了如何制作一些东西来检查用于告诉它不再绘制新行的跟踪变量。
你可以做的最接近停止绘图的事情是这样的:
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 下面的评论,我添加了附加跟踪并更新了清除功能。这应该允许 start stop start 没有问题,也能够清除该字段。
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()
我同意@Mike-SMT 回答中的观点,但我会换一种方式。在我看来,海龟及其控件非常像一个 Python 生成器,因此我将其重铸为这样。海龟沿着一条路径移动,一次一个像素,产生控制,可能会或可能不会 return。或者它可能会耗尽它的路径并停止迭代:
import tkinter as tk
from turtle import RawTurtle
PATH = [(100.00, 0.00), (100.00, -100.00), (200.00, -100.00), (200.00, -200.00), (100.00, -200.00)]
def run():
for position in PATH:
turtle.setheading(turtle.towards(position))
while turtle.distance(position) > 1:
turtle.forward(1)
yield
def start():
global generator, running
running = True
while running:
try:
next(generator)
except ValueError: # user clicked start but already running
return
except TypeError: # new run
turtle.reset()
generator = run()
except StopIteration: # end of complete run
generator = None
running = False
break
def stop():
global running
running = False
def clear():
global generator
turtle.reset()
generator = None
root = tk.Tk()
canvas = tk.Canvas(width=500, height=500)
canvas.pack()
turtle = RawTurtle(canvas, "turtle")
running = True
generator = None
tk.Button(text="Start", command=start).pack(side=tk.LEFT, expand=tk.TRUE)
tk.Button(text="Stop", command=stop).pack(side=tk.LEFT, expand=tk.TRUE)
tk.Button(text="Clear", command=clear).pack(side=tk.LEFT, expand=tk.TRUE)
root.mainloop()
Also the clear button works but afterwards the start button doesn't
work anymore. If someone can help me with that as well.
您可以将当前的 clear()
函数替换为:
def clear():
t.clear()
如果您只是想擦除绘制的路径,而将海龟留在它结束的地方。如果你想擦除路径并将乌龟重置回起点,请改为:
def clear():
t.reset()
我正在尝试让海龟动画以一个按钮开始并以一个按钮停止。从按钮开始很容易,但我似乎无法找出停止按钮?到目前为止,这是我的代码:
import turtle
import tkinter as tk
def start():
t.forward(100)
t.right(90)
t.forward(100)
t.left(90)
t.forward(100)
t.right(90)
t.forward(100)
t.right(90)
t.forward(100)
def stop():
t.stop
def clear():
canvas.delete("all")
root = tk.Tk()
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()
清除按钮也能用,但之后开始按钮就失效了。如果有人也可以帮助我。
感谢@Mike - SMT 帮助我编写此代码。这是经过编辑且功能齐全的代码:
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
running = True
def stop():
global tracker, started
tracker = True
started = False
def clear():
global t, tracker, started, start_ndex
t.reset()
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()
除非在绘制的每条线之间提供检查器,否则无法停止每个绘制语句。
下面的代码只是一个粗略的模型,展示了如何制作一些东西来检查用于告诉它不再绘制新行的跟踪变量。
你可以做的最接近停止绘图的事情是这样的:
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 下面的评论,我添加了附加跟踪并更新了清除功能。这应该允许 start stop start 没有问题,也能够清除该字段。
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()
我同意@Mike-SMT 回答中的观点,但我会换一种方式。在我看来,海龟及其控件非常像一个 Python 生成器,因此我将其重铸为这样。海龟沿着一条路径移动,一次一个像素,产生控制,可能会或可能不会 return。或者它可能会耗尽它的路径并停止迭代:
import tkinter as tk
from turtle import RawTurtle
PATH = [(100.00, 0.00), (100.00, -100.00), (200.00, -100.00), (200.00, -200.00), (100.00, -200.00)]
def run():
for position in PATH:
turtle.setheading(turtle.towards(position))
while turtle.distance(position) > 1:
turtle.forward(1)
yield
def start():
global generator, running
running = True
while running:
try:
next(generator)
except ValueError: # user clicked start but already running
return
except TypeError: # new run
turtle.reset()
generator = run()
except StopIteration: # end of complete run
generator = None
running = False
break
def stop():
global running
running = False
def clear():
global generator
turtle.reset()
generator = None
root = tk.Tk()
canvas = tk.Canvas(width=500, height=500)
canvas.pack()
turtle = RawTurtle(canvas, "turtle")
running = True
generator = None
tk.Button(text="Start", command=start).pack(side=tk.LEFT, expand=tk.TRUE)
tk.Button(text="Stop", command=stop).pack(side=tk.LEFT, expand=tk.TRUE)
tk.Button(text="Clear", command=clear).pack(side=tk.LEFT, expand=tk.TRUE)
root.mainloop()
Also the clear button works but afterwards the start button doesn't work anymore. If someone can help me with that as well.
您可以将当前的 clear()
函数替换为:
def clear():
t.clear()
如果您只是想擦除绘制的路径,而将海龟留在它结束的地方。如果你想擦除路径并将乌龟重置回起点,请改为:
def clear():
t.reset()