2015-01-25 6 views
1


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

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)) 
+0

Понимаемая. Спасибо огромное! :) –

Смежные вопросы