Tkin中的“停止”按钮

2024-04-26 13:52:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着让一个乌龟动画从一个按钮开始到一个按钮停止。用一个按钮我很难停下来?以下是我目前为止的代码:

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帮助我完成这段代码。以下是经过编辑且功能齐全的代码:

^{pr2}$

Tags: 代码textimportrightdefbuttonleft按钮
2条回答

除非在绘制的每一行之间提供一个检查器,否则无法停止每个draw语句。在

下面的代码只是一个粗略的模型,演示如何制作一些东西来检查跟踪变量,该变量用于告诉它不再绘制新行。在

最接近停止绘图的方法是:

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下面的评论,我添加了添加跟踪并更新了clear函数。这应该允许启动-停止-启动没有问题,也能够清除现场。在

^{pr2}$

我同意@Mike SMT的回答中的想法,但我会用另一种方式来做。海龟和它的控件在我看来非常像一个Python生成器,所以我把它改成这样。海龟沿着一条路径移动,一次一个像素,产生控制权,这个控制权可能返回,也可能不会返回。或者它可能会耗尽路径并停止迭代:

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()函数替换为:

^{pr2}$

如果你只想抹去画好的路,却把乌龟留在它的终点。如果要删除路径并将海龟重置回起点,请执行以下操作:

def clear():
    t.reset()

相关问题 更多 >