Python中的箭头命令

Python中的箭头命令,python,tkinter,turtle-graphics,tkinter-canvas,Python,Tkinter,Turtle Graphics,Tkinter Canvas,我一直在尝试使用画布功能将海龟放入tkinter。我想做一个乌龟蚀刻素描器,这样我就可以用箭头键控制乌龟了。我似乎无法让它工作,也不理解它所吐出的错误: name错误:未定义名称“屏幕” 这是我的密码: import tkinter as tk import turtle window = tk.Tk() window.geometry("750x500") window.resizable(0,0) app = tk.Canvas(master = window,

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

name错误:未定义名称“屏幕”

这是我的密码:

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()

但我发现代码还有其他问题。我会使用
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()
将tkinter作为tk导入
进口海龟
#---功能---
def k1(事件):
t、 转发(1)
def k2(事件):
t、 左(1)
def k3(事件):
t、 右(1)
def k4(事件):
t、 背面(1)
#---梅因---
window=tk.tk()
窗几何(“750x500”)
窗口。可调整大小(False,False)
canvas=tk.canvas(主窗口=窗口,宽度=500,高度=500,bg=“白色”)
canvas.pack()
t=海龟。生海龟(帆布)
window.bind(“,k1)
window.bind(“,k2)
window.bind(“,k3)
window.bind(“,k4)
window.mainloop()
您必须使用

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()
将tkinter作为tk导入
进口海龟
#---功能---
def k1(事件):
t、 转发(1)
def k2(事件):
t、 左(1)
def k3(事件):
t、 右(1)
def k4(事件):
t、 背面(1)
#---梅因---
window=tk.tk()
窗几何(“750x500”)
窗口。可调整大小(False,False)
canvas=tk.canvas(主窗口=窗口,宽度=500,高度=500,bg=“白色”)
canvas.pack()
t=海龟。生海龟(帆布)
window.bind(“,k1)
window.bind(“,k2)
window.bind(“,k3)
window.bind(“,k4)
window.mainloop()

正如您使用
RawTurtle
而不是
Turtle
一样,当您使用tkinter窗口中嵌入的Turtle时,如果您需要它提供的方法,您需要使用
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()

在这种情况下,不要使用独立turtle的
屏幕
,因为它可能会创建第二个tkinter根窗口,导致以后出现细微错误(如未加载图像)。

正如您在tkinter窗口中使用turtle时使用的是
RawTurtle
而不是
turtle
,如果您希望使用TurtleScreen提供的方法,则需要使用
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()

在这种情况下,不要使用独立turtle的
屏幕
,因为它可能会创建第二个tkinter根窗口,导致以后出现细微错误(如未加载图像)。

使用
turtle.Screen()
而不是
Screen()
使用
turtle.Screen()
而不是
Screen()
在回答的开头部分,我不建议在这种情况下使用
turtle.Screen()
,因为它可能会创建第二个tkinter根窗口,导致以后出现细微错误(如图像不工作)。我建议改为使用
TurtleScreen()
。在回答的开头部分,在这种情况下,我不建议使用
turtle.Screen()
,因为它可能会创建第二个tkinter根窗口,导致以后出现细微错误(如图像不工作)。我建议使用
TurtleScreen()
。您可以添加一个说明,说明为什么
TurtleScreen()
TurtleScreen()更好吗
。这将有助于改进这个答案,因为你的答案没有说“为什么”。@Mike SMT,我在@furas answer的评论中包含了为什么,该评论复制了OP使用
屏幕的错误
——我已将该解释复制到我的答案中,以使其更完整,正如您正确建议的那样。您能否添加一个说明,说明为什么
TurtleScreen()
优于
turtle.Screen()
。这将有助于改进这个答案,因为你的答案没有说“为什么”。@Mike SMT,我在@furas answer的评论中包含了为什么,它复制了OP使用<代码>屏幕的错误——正如你正确建议的那样,我已将该解释复制到我的答案中,以使其更完整。