Странная ошибка анимации после запуска - PullRequest
0 голосов
/ 18 сентября 2011

У меня есть проект Python 2.7 / PyGTK 2.24.Я работаю на Linux Ubuntu 11.

Я использую следующий код для анимации движения изображения по экрану.

    def move_fish():
        global fishmove, flipped
        if fishmove < 440 and flipped == False:
            fishmove = fishmove + 10
            fixed_hab.move(fish1, fishmove, 50)
            return True
        elif fishmove == 440 and flipped == False:
            pixbufanim = gtk.gdk.PixbufAnimation("IMG/IMG-FISH-L.gif")
            fish1.set_from_animation(pixbufanim)
            flipped = True
            fishmove = fishmove - 10
            fixed_hab.move(fish1, fishmove, 50)
            return True
        elif fishmove > 0 and flipped == True:
            fishmove = fishmove - 10
            fixed_hab.move(fish1, fishmove, 50)
            return True
        elif fishmove == 0 and flipped == True:
            pixbufanim = gtk.gdk.PixbufAnimation("IMG/IMG-FISH-R.gif")
            fish1.set_from_animation(pixbufanim)
            flipped = False
            return True                

    gobject.timeout_add(100, move_fish)

Код работает нормально, без ошибок компиляции или ошибокво время выполнения.Однако, ПОСЛЕ того, как я закрываю окно, я получаю следующую ошибку несколько раз.(Имейте в виду, объекты fixed_hab (gtk.Fixed) и fish1 (gtk.Image) находятся в той же области видимости, что и объявление функции "def move_fish ():"

Word4Word-9-16.py: 1655: GtkWarning: gtk_fixed_move_internal: утверждение `widget-> parent == GTK_WIDGET (fixed) 'не удалось fixed_hab.move (fish1, fishmove, 50)

Это серьезно? Можно это исправить?Это затруднит работу для конечного пользователя?

Заранее спасибо!

1 Ответ

0 голосов
/ 05 октября 2011

Скорее всего, ваш tiemout_add срабатывает, пока приложение уничтожено.Возможны следующие варианты:

  1. Подключите обработчик уничтожения и удалите таймер перед выходом.
  2. Самый верхний внутри move_fish, проверьте, уничтожен ли виджет, и верните False, чтобы завершить таймер.

Доступ к виджету, который больше не существует, может молча завершиться сбоем, но при изменении логики вашего приложения он может даже с шумоподавлением.

...