Python Tkinter - Toplevel MoveInAnimation


Есть ли возможность просто переместить Tkinter TopLevel() окно во время выполнения с помощью анимации? Я думал о плавном перемещении анимации, запускаемой кнопкой.
Вот фрагмент кода:

from Tkinter import Toplevel

class MoveInTopLevel(Toplevel):
    '''
    Animated MoveInToplevel.
    '''
    def __init__(self, *args, **kwargs):
        Toplevel.__init__(self, *args, **kwargs)
        self.overrideredirect(1)

    def move_in_from_bottom(self, rootHeight):
        y = rootHeight
        y = max(y-1, 0)
        s = "100x100+0+" + str(y)
        print s

        self.geometry(s)
        self.deiconify()

        if  y > 0:
            self.after(5, self.move_in_from_bottom(y))

Вызывается, например, в mainFunction так:

window = MoveInTopLevel()
window.move_in_from_bottom(480) # That's some resolution (height)

Когда я запускаю это, я получаю окно, правильно отображаемое в конечной позиции (0,0), и все координаты распечатываются от (0,479) до (0,0). Но между ними нет окон, хотя я звоню deiconify(),
Кто-нибудь может мне помочь? Я сбит с толку. ^^

Заранее спасибо. Привет!

1 ответ

Решение

Посмотрите на эту строку кода:

self.after(5, self.move_in_from_bottom(y))

В этой строке кода вы сразу звоните self.move_in_from_bottom перед вызовом после и результатом этого вызова (None) передается after команда.

after Метод нуждается в ссылке на функцию. Обычный способ сделать это - использовать лямбду, хотя functools.partial тоже хорошо работает.

Вот пример использования лямбды:

self.after(5, lambda y=y: self.move_in_from_bottom(y))
Другие вопросы по тегам