Изменение фонового изображения черепахи во второй раз приводит к тому, что окно черепахи перестает отвечать - PullRequest
0 голосов
/ 04 декабря 2018

В моем коде я написал определение для изменения фона черепахи после завершения действия.Определение для меня выглядит хорошо, и я не вижу никаких проблем с ним, но когда действие завершено и фоновое изображение должно измениться, окно черепахи перестает отвечать на запросы.Вот определение, о котором я говорю:

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 голосов
/ 04 декабря 2018

Документация для clear() понятна:

Сброс TurtleScreen в исходное состояние: белый фон, без фонового изображения, без привязок к событиям и трассировки.

Все ваши привязки событий (т.е. ondrag()) отменяются clear(), поэтому вы должны повторить их.

ОБНОВЛЕНИЕ

Метод clear() на экране(aka clearscreen() fuction) является более серьезным, чем может поверить документация.Кажется, он уничтожает все созданные пользователем черепахи и сбрасывает черепаху по умолчанию в исходное состояние.

Метод .reset() на экране не намного лучше - вы сохраняете своих черепах, но они теряют все атрибуты, которые выset.

В качестве альтернативы очистке или сбросу экрана я предлагаю вам попросить черепах clear() очистить любой рисунок, если перо не работает, и затем переместить их в новые места или home().

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