第二次更改乌龟背景图像会导致乌龟窗口无响应

时间:2018-12-03 22:38:54

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

在我的代码中,我编写了一个定义,以在操作完成后更改乌龟的背景。对我而言,该定义看起来不错,并且看不到任何问题,但是当操作完成并且假定背景图像发生更改时,乌龟窗口将变得无响应。这是我正在谈论的定义:

if default.distance(pickaxe) < 10:
        screen.clearscreen()
        wn.bgpic('TrumpTowersInside.gif')

如果出于任何原因需要其余代码,那么这是我的基于乌龟的游戏的其余代码:

from turtle import Screen, Turtle

def get_mouse_click_coor(x, y):
    print(x, y)

def drag(x, y):
    default.ondrag(None)  # disable handler inside handler

    default.goto(x, y)

    if default.distance(scar) < 40:
        default.shape('defaultscar.gif')
        scar.hideturtle()
        mini.hideturtle()
        pickaxe.showturtle()

    if default.distance(mini) < 40:
        banshee.goto(-200,200)
        banshee.showturtle()
        banshee.speed(0)
        for x in range(200):
            banshee.forward(1)
            banshee.right(90)
            banshee.forward(1)
            banshee.left(90)
        banshee.shape('banshee.gif')
        banshee.left(90)
        banshee.forward(50)
        scar.hideturtle()
        mini.hideturtle()
        banshee.shape('bansheescar.gif')
        default.shape('defaultdead.gif')

    if default.distance(pickaxe) < 10:
        screen.clearscreen()
        wn.bgpic('TrumpTowersInside.gif')


    default.ondrag(drag)

wn = Screen()
wn.setup(500, 500)
wn.bgpic('TrumpTowers.gif')
wn.register_shape('default.gif')
wn.register_shape('scar.gif')
wn.register_shape('defaultscar.gif')
wn.register_shape('mini.gif')
wn.register_shape('defaultgliding.gif')
wn.register_shape('banshee.gif')
wn.register_shape('bansheescar.gif')
wn.register_shape('defaultdead.gif')
wn.register_shape('pickaxe.gif')

scar = Turtle('scar.gif', visible=False)
scar.speed(-1)
scar.color('pink')
scar.penup()
scar.left(90)
scar.forward(50)
scar.showturtle()

mini = Turtle('mini.gif', visible=False)
mini.speed(-1)
mini.color('pink')
mini.penup()
mini.forward(60)
mini.showturtle()

default = Turtle('default.gif', visible=False)
default.shapesize(2)
default.speed(1)
default.penup()
default.left(90)
default.backward(50)
default.showturtle()

default.ondrag(drag)

banshee = Turtle('defaultgliding.gif', visible=False)
banshee.shapesize(2)
banshee.speed(1)
banshee.penup()
# banshee.showturtle()

pickaxe = Turtle('pickaxe.gif', visible=False)
pickaxe.pu()
pickaxe.forward(10)
pickaxe.left(90)
pickaxe.forward(50)

wn.mainloop()

1 个答案:

答案 0 :(得分:1)

clear()的文档在以下内容上很清楚:

  

将TurtleScreen重置为其初始状态:白色背景,       没有背景图片,没有事件绑定和跟踪。

ondrag()撤消了所有事件绑定(即clear()),因此您已重做它们。

更新

屏幕的clear()方法(也称为clearscreen()功能)比文档可能使人们相信的更为严格。似乎会破坏所有用户创建的乌龟,并将默认乌龟重置为其初始状态。

屏幕上的.reset()方法并没有好得多-您可以保留乌龟,但它们会丢失您设置的所有属性。

作为清除或重置屏幕的一种替代方法,建议您让乌龟clear()清理掉笔下的所有图形,然后将它们移动到新位置或home()。 / p>

from turtle import Screen, Turtle

def drag(x, y):
    default.ondrag(None)  # disable handler inside handler

    default.goto(x, y)

    if default.distance(pickaxe) < 10:
        wn.bgpic('TrumpTowersInside.gif')
        pickaxe.hideturtle()  # should move it elsewhere

    default.ondrag(drag)

wn = Screen()
wn.setup(500, 500)
wn.bgpic('TrumpTowers.gif')

default = Turtle('turtle', visible=False)
default.color('red')
default.shapesize(2)
default.penup()
default.left(90)
default.backward(50)
default.showturtle()

default.ondrag(drag)

pickaxe = Turtle('turtle', visible=False)
pickaxe.color('green')
pickaxe.penup()
pickaxe.forward(10)
pickaxe.left(90)
pickaxe.forward(50)
pickaxe.showturtle()

wn.mainloop()