乌龟的颜色不会随着变量和列表而改变

时间:2019-11-20 11:12:08

标签: python python-3.x turtle-graphics

所以这是我现在的代码,问题应该在第18行和第37行之间。我想做的是,当用户单击左上角的乌龟时,它将变为下一种颜色。左上角的乌龟只是光学的,没有其他功能,只能告诉用户单击位置(至少是这样)。问题在于它没有做到这一点,而我并没有真正弄清楚为什么

import turtle
from turtle import *

# def on_click_handler(x,y):
# print("Clicked: " , [x,y])
# t1.goto(x,y)

sc = Screen()
sc.setup(400, 400, 10, 10)
sc.setworldcoordinates(-300, -300, 300, 300)
# sc.onscreenclick(on_click_handler)

t1 = Turtle("turtle")
t1.shape("circle")
t1.shapesize(0.25, 0.25)
t1.speed(-1)

#changing turtle colour
tcolour = Turtle("turtle")
tcolour.penup()
tcolour.shape("square")
tcolour.shapesize(1, 1.5)
tcolour.setpos(-275, 285)
colour_list = ["#000000", "#0101DF", "#04B404", "#FF0000", "#FF8000", "B40486"] #black, blue, green, red, orange, purple
n = 0

def colourchange(x, y):
    if (x < -275 and x > -300 and y > 284 and y < 300):
        global n
        n += 1


turtle.onscreenclick(colourchange, 1)
turtle.listen()

t1.color(colour_list[0+n])

def dragging(x, y):
    t1.ondrag(None)
    t1.setheading(t1.towards(x, y))
    t1.goto(x, y)
    t1.ondrag(dragging)


def clickright(x, y):
    t1.clear()


def main():
    turtle.listen()

    t1.ondrag(dragging)
    turtle.onscreenclick(clickright, 3)

    sc.mainloop()


main()

而且我也不认为我可以进口tkinter,至少我认为这是我们教授所说的

1 个答案:

答案 0 :(得分:0)

每当您以两种不同的方式导入同一模块时,就已经遇到麻烦了:

import turtle
from turtle import *

您在区分乌龟和屏幕时遇到了问题-使用上述方法可以解决这些问题。相反,我建议您只使用turtle的面向对象的界面并关闭功能界面:

from turtle import Screen, Turtle

您尝试使用乌龟作为按钮,这很好,但是您将点击处理程序放在屏幕上,并且如果单击了乌龟,则对处理程序进行了测试。而是将点击处理程序放在乌龟上,这样就无需测试。 (同样,部分原因是不清楚海龟的功能和屏幕的功能。)

尽管您两次调用它,但listen()不适用于此处(因为尚未处理键盘输入)。

最后,您的颜色更改处理程序更新了颜色索引,但从未实际更改任何颜色。以下是我为解决上述问题而对您的代码进行的重做和简化:

from turtle import Screen, Turtle

COLOUR_LIST = ['black', 'blue', 'green', 'red', 'orange', 'purple']

colour_index = 0

def colour_change(x, y):
    global colour_index

    colour_index = (colour_index + 1) % len(COLOUR_LIST)
    t1.color(COLOUR_LIST[colour_index])

def dragging(x, y):
    t1.ondrag(None)
    t1.setheading(t1.towards(x, y))
    t1.goto(x, y)
    t1.ondrag(dragging)

def click_right(x, y):
    t1.clear()

t1 = Turtle('circle')
t1.shapesize(0.5)
t1.speed('fastest')
t1.color(COLOUR_LIST[colour_index])
t1.ondrag(dragging)

# changing colour turtle
tcolour = Turtle('square')
tcolour.penup()
tcolour.shapesize(1, 1.5)
tcolour.setpos(-275, 285)
tcolour.onclick(colour_change, 1)

screen = Screen()
screen.onclick(click_right, btn=3)
screen.mainloop()