【问题标题】:Arrow Commands in Python TurtlePython Turtle 中的箭头命令
【发布时间】:2023-06-30 18:37:02
【问题描述】:

我一直在尝试使用画布功能将海龟放入 tkinter。我希望能够制作一个海龟蚀刻素描器,这样我就可以用箭头键控制海龟。我似乎无法让它工作并且不理解它吐出的错误:

NameError: name 'Screen' is not defined

这是我的代码:

import tkinter as tk
import turtle

window = tk.Tk()
window.geometry("750x500")
window.resizable(0,0)

app = tk.Canvas(master = window,
                width = 500,
                height = 500,
                bg = "white")
app.pack()
Screen()
turtle = turtle.RawTurtle(app)
turtle = turtle.Screen()

def k1():
    move.forward(1)

def k2():
    move.left(1)

def k3():
    move.right(1)

def k4():
    move.back(1)

turtle.onkey(k1, "Up")
turtle.onkey(k2, "Left")
turtle.onkey(k3, "Right")
turtle.onkey(k4, "Down")

turtle.listen()
window.mainloop()

【问题讨论】:

  • 使用turtle.Screen()而不是Screen()

标签: python tkinter turtle-graphics tkinter-canvas


【解决方案1】:

你必须使用

turtle.Screen()

而不是

Screen()

但我发现代码存在其他问题。我会使用tkinter方法bind()在按键时执行功能。

import tkinter as tk
import turtle

# --- functions ---

def k1(event):
    t.forward(1)

def k2(event):
    t.left(1)

def k3(event):
    t.right(1)

def k4(event):
    t.back(1)

# --- main ---

window = tk.Tk()

window.geometry("750x500")
window.resizable(False, False)

canvas = tk.Canvas(master=window, width=500, height=500, bg="white")
canvas.pack()

t = turtle.RawTurtle(canvas)

window.bind("<Up>", k1)
window.bind("<Left>", k2)
window.bind("<Right>", k3)
window.bind("<Down>", k4)

window.mainloop()

【讨论】:

  • 在您回答的开头,我不建议在这种情况下使用turtle.Screen(),因为它可能会创建一个 second tkinter 根窗口,从而导致稍后出现细微错误(比如图片不工作。)我推荐TurtleScreen()
【解决方案2】:

正如您使用RawTurtle 而不是Turtle,当您在tkinter 窗口中使用turtle embedded 时,您需要使用TurtleScreen 而不是Screen,如果您想要它提供的方法:

import tkinter as tk
from turtle import TurtleScreen, RawTurtle

window = tk.Tk()
window.geometry("750x500")
window.resizable(0, 0)

canvas = tk.Canvas(master=window, width=500, height=500)
canvas.pack()

screen = TurtleScreen(canvas)
turtle = RawTurtle(screen)

def k1():
    turtle.forward(1)

def k2():
    turtle.left(1)

def k3():
    turtle.right(1)

def k4():
    turtle.back(1)

screen.onkey(k1, "Up")
screen.onkey(k2, "Left")
screen.onkey(k3, "Right")
screen.onkey(k4, "Down")

screen.listen()
screen.mainloop()

在这种情况下不要使用独立海龟的Screen,因为它可能会创建第二个 tkinter 根窗口,从而导致稍后出现细微的错误(例如无法加载图像。)

【讨论】:

  • 您能否补充说明为什么TurtleScreen()turtle.Screen() 更好。这将有助于改善这个答案,因为你的答案没有说“为什么”。
  • @Mike-SMT,我在我对@furas 答案的评论中包含了 why,它复制了 OP 使用 Screen 的错误——我已将该解释复制到正如您正确建议的那样,我的回答使其更完整。
最近更新 更多