当前位置: 首页 > 知识库问答 >
问题:

使用onkey()和字典绘制海龟(python)的错误

龚凯泽
2023-03-14

我决定根据我收到的建议重做这个问题,这是一个我第一年的作业问题,uni,python编码。我的代码中有bug,无法找到修复它们的方法。错误1乌龟在程序运行时开始画图,即使笔已打开。BUG 2未定义的键,如“s、7、tab”触发空格键功能

着色书

在本任务中,您将创建一个儿童着色游戏,在该游戏中,可以通过围绕形状进行跟踪,然后填充来为给定的图片着色。控件如下所示。

箭头键-将“画笔”(海龟光标)向左、向右、向上或向下移动一个固定的小量。

'z'-撤消最后一步。

“r”、“g”、“b”-将画笔颜色分别更改为红色、绿色或蓝色。(如果您愿意,可以定义更多颜色,但我们希望至少有这三种颜色。)

空格键-切换绘制模式。在初始模式“移动”模式下,“画笔”(乌龟)在屏幕上移动而不绘制。在“绘制”模式下,画笔移动时会留下一条彩色线。最重要的是,当模式从“绘制”更改为“移动”时,画笔绘制的区域将充满颜色。

from turtle import *
from functools import partial 
bgpic("Colour_A_Turkey.gif") # change this to change the picture

#control the accuracy/speed of the drawing 
step_size =8
pensize(4)
penup()

# whenever spacebar is pressed the current state  and next state switch values 
current_state = penup
next_state = pendown
def space_bar():
    global current_state, next_state
    next_state()
    current_state, next_state = next_state, current_state
    #if the current stat is penup fill in with current colour
    if current_state == penup:
        end_fill()
    else:
        begin_fill()
onkey(space_bar, " ")

# undo do a mistake function
def mistake():
    undo()
onkey(mistake, "z")

#using partial function to store the following functions
#so they can be called  as arguments from a dictionary
#movement
strait = partial(fd, step_size)
reverse = partial(bk, step_size)
turn_rt = partial(rt, step_size)
turn_lf = partial(lt, step_size)

#colour
brow = partial(color, "brown")
gree = partial(color, "green")
yell = partial(color, "yellow")
oran = partial(color, "orange")
purp = partial(color, "purple")
red = partial(color, "red")
blue = partial(color, "blue")


#create a dictionary to store all the keys and there abilities 
key_action = {"b" : blue, "r" : red, "p" : purp, "o" : oran,\
          "y" : yell, "g" : gree, "w" : brow, "Right" : turn_rt , "Up" : strait,\
          "Down" : reverse, "Left" : turn_lf, "z" : undo()}

#when a key in then above dictionary
#is pressed it's function  is activated
for pressed_key, activated_key in key_action.items():
    onkey(activated_key, pressed_key)  

#make turtle look for key strokes with predefined function
listen()
#finish
done()

共有3个答案

彭建业
2023-03-14

为什么要定义所有的功能?我们可以直接使用:Break the判决为:

key_action = {"b" : "blue", "r" : "red", "p" : "purple", "o" : "orange", "y" : "yellow","g" : "green", "w" : "brown","Right" : rt , "Left": lt, "Up" : fd, "Down" : bk,"z" : undo}


no_input = ["z"]

one_input = ["Right", "Left", "Up", "Down"]

for key in key_action:
    activated_key = key_action[key]
    if key in no_input:
       activated_key()
    elif key in one_input():
        activated_key(step_size)
    else:
        onkey(color(activated_key), key)
易和怡
2023-03-14

你的字典方法是沿着正确的思维方式。但是,您的函数将无法正常运行。使用字典比你想象的要简单。首先,你必须对String有单独的函数,并正确处理它们。因为他们每个人的行为都不同:

# Get rid of the top four lines, they will not work
# All actions mapping
key_action = {"b" : "blue", "r" : "red", "p" : "purple", "o" : "orange",
              "y" : "yellow", "g" : "green", "w" : "brown",
              "Right" : rt , "Left": lt, "Up" : fd, "Down" : bk,
              "z" : undo}
# Note down which are special actions
# Functions with no input
foo = ["z"]
# Function with one input
bar = ["Right", "Left", "Up", "Down"]

# Assuming the input key is get here, I don't use turtle don't know how
# the input is read
key = listen()  # PSEUDOCODE!

# Handle the input
if key in foo:
     foo[key]() # Execute no input function
elif key in bar:
     foo[key](step_size)
else:
     onkey(key_action[key], key)
韩照
2023-03-14

记住,在Python中,一切都是一个对象,我们的意思是。函数也是对象。我们可以在字典中存储函数,事实上,这正是您在这里想要做的。

turn_lf = lt(step_size )

这里的关键问题是,您希望存储一个调用lt的函数,其中step_size作为参数,但是这里您刚刚调用了lt,其中step_size作为参数,并且存储返回值。

可以说,获得所需内容的最简单方法是使用functools.partial来“绑定”步长参数。

from functools import partial
turn_lf = partial(lt, step_size) # `lt` is not called yet.

# Now, later on, we can do
turn_lf() # and it's just as if we did `lt(step_size)`.
# So now we can store `turn_lf` in a dict, look it up and call it later, etc.

# Similarly for all the other functions you want to make.

(另一个问题是您没有与此保持一致;如果您希望所有内容都在一个判决中进行,那么您还需要为颜色函数指示绑定。幸运的是,这和其他函数一样简单:我们只是让我们的部分(颜色,'棕色')

至于“z”:delete,我们没有任何参数绑定到undo。因此,虽然我们可以按照模式编写partial(undo)(注意,没有更多参数,因为我们没有绑定任何内容),但直接编写undo更有意义。

顺便说一句,我们可以简化一下:

for key in key_action:
    pressed_key = key
    activated_key = key_action[key]

对此:

for pressed_key, activated_key in key_action.items():

 类似资料:
  • 在1966年,Seymour Papert和Wally Feurzig发明了一种专门给儿童学习编程的语言——LOGO语言,它的特色就是通过编程指挥一个小海龟(turtle)在屏幕上绘图。 海龟绘图(Turtle Graphics)后来被移植到各种高级语言中,Python内置了turtle库,基本上100%复制了原始的Turtle Graphics的所有功能。 我们来看一个指挥小海龟绘制一个长方形的

  • 问题内容: 有没有办法直接使用字典中的数据来绘制条形图? 我的字典看起来像这样: 我期待 工作,但事实并非如此。 这是错误: 问题答案: 您可以通过首先绘制条形图然后设置适当的刻度来分两行进行: 请注意,倒数第二行应在python3中读取,因为它会返回一个生成器,而matplotlib无法直接使用该生成器。

  • 我在绘制以下值时遇到一些问题: 我所做的是 但我有一个错误: TypeError:ufunc“add”不包含签名类型与dtype匹配的循环(' 那么我已经试过了 但我还有另外一个错误: TypeError:不可损坏的类型:“列表” 我对频率感兴趣。 我该怎么做才能修好它? 从原始数据集(因为我在复制代码时遇到了一些错误): 输出: 我需要绘制每个单词中值的频率(例如,对于单词1,132和144的频

  • 问题内容: 我有以下列表,其中包含重复的具有不同值的汽车注册号。我想将其转换为字典,该字典接受汽车登记号的多个键。 到目前为止,当我尝试将列表转换为字典时,它消除了键之一。如何制作具有重复键的字典? 清单是: 我试过的代码是: 问题答案: Python字典不支持重复键。一种解决方法是将列表或集合存储在字典中。 一种简单的方法是使用: 你要做的就是更换 与 你将获得一个列表字典。

  • 我正试着用Jupyter笔记本画热图。我的表由10个列和许多行组成。第一行是列名。我正在使用plotly lib。 dfs是数据帧。 而不是图形,我得到了很多这样的线条: '\n跟踪=判(\n x=x,y=y,z=z,\n类型="散射3d",\n模式=\'标记\',\n标记=判(大小=5,颜色=\'黑色\',线=判(宽度=0)))\n数据=[跟踪]\n\n\n etc 有什么问题?