2013-07-08 3 views
1

im пытается сделать изображение прокручивать экран до тех пор, пока оно не достигнет середины и не остановится. Как я могу это достичь? Im использует python 2.7 с tkinter и PIL lib.Python photo animation trouble

Спасибо за помощь !!!

+0

Это, как правило, ценится, если вы разместите некоторые фрагменты вы пробовали уже. Я бы рекомендовал использовать что-то вроде «pygame», что делает это тривиально простым. Не знаете, почему вы используете PIL тогда: o – enpenax

+0

о, простите об этом. Я использую PIL, потому что я думал, что это единственный способ получить файлы изображений в Python. Я нахожу это особенно странным, могу ли я также достичь этого с pygame? –

ответ

1

Это, безусловно, возможно с хорошим старым tkinter! Это должно работать, не удалось проверить материал PIL, но я его протестировал без него. Нажмите левую клавишу, чтобы переместить изображение.

from Tkinter import * 
from PIL import Image, ImageTk 

class App: 
    def __init__(self,master): 
     self.xRes = 500 
     self.yRes = 500 
     master.geometry(str(self.xRes)+"x"+str(self.yRes)) 
     #if you didnt have PIL (gif only): myImage = PhotoImage(file="image.gif") 
     myImage = ImageTk.PhotoImage(Image.open("image.jpg")) 
     self.photoFrame = Label(master,image = myImage,width = 300, height = 300) 
     self.photoFrame.place(x=-310, y=0) 
     self.photoFrame.image = myImage 
     self.photoFrame.focus_set() 
     self.photoFrame.bind("<Left>",self.animate) 


    def moveImage1(self): 
     cur = int(self.photoFrame.place_info()["x"]) 
     pWidth = str(self.photoFrame.cget("width")) 
     print(pWidth) 
     while cur != (self.xRes/2) - (int(pWidth)/2): 
      cur = int(self.photoFrame.place_info()["x"]) 
      self.photoFrame.place(x=cur+2, y=0) 
      print(cur) 
      root.update() 


    def animate(self,event): 
     self.moveImage1() 

root = Tk() 
app = App(root) 
root.mainloop() 

Если вы хотите добавить больше анимации, вы бы создать больше методов, как moveImage1, по одному для каждой анимации. Тогда просто назовите их, как вам нравится. Метод получает текущую позицию x виджета Label, а затем увеличивает его на 2. Затем вызывается root.update() для обновления окна. Дайте мне знать, если вам нужно что-нибудь дополнительное.

+0

вместо цикла while вы можете использовать 'after' для перемещения изображения на один блок, а затем использовать метод' after', чтобы он планировал запустить его за несколько десятков миллисекунд в зависимости от того, как быстро вы хотите его перемещать. –

+0

true! Я не уверен, что это нужно, tkinter не может быстро перемещать изображения – mbdavis

+0

Что значит, что вы не можете быстро перемещать изображения? Как быстро вам это нужно? Я могу перемещать его столько пикселей, сколько нужно каждые пару миллисекунд или около того. Вы можете получить 60 кадров в секунду или больше для простой анимации. –

0

Вот пример изображения, который перемещается слева к центру холста:

import Tkinter as tk 

imagedata = ''' 
    R0lGODlhEAAQAMQZAMPDw+zs7L+/v8HBwcDAwLW1teLi4t7e3uDg4MLCwuHh4e7u7t/f38TExLa2 
    tre3t7i4uL6+vu/v77q6uu3t7b29vby8vLm5ubu7u+3t7QAAAAAAAAAAAAAAAAAAAAAAACH5BAEA 
    ABkALAAAAAAQABAAAAWNYCaOZFlWV6pWZlZhTQwAyYSdcGRZGGYNE8vo1RgYCD2BIkK43DKXRsQg 
    oUQiFAkCI3iILgCLIEvJBiyQiOML6GElVcsFUllD25N3FQN51L81b2ULARN+dhcDFggSAT0BEgcQ 
    FgUicgQVDHwQEwc+DxMjcgITfQ8Pk6AlfBEVrjuqJhMOtA4FBRctuiUhADs= 
''' 

class Example(tk.Frame): 
    def __init__(self, *args, **kwargs): 
     tk.Frame.__init__(self, *args, **kwargs) 

     self.canvas = tk.Canvas(self) 
     self.canvas.pack(side="bottom", fill="both", expand=True) 

     self.image = tk.PhotoImage(data=imagedata) 
     image_id = self.canvas.create_image(0,0, anchor="nw", image=self.image) 

     self.move_to_center(image_id) 

    def move_to_center(self, id): 
     (x0,y0) = self.canvas.coords(id) 
     if x0 < int(self.canvas.winfo_width()/2): 
      self.canvas.move(id, 1,0) 
     self.after(10, lambda id=id: self.move_to_center(id)) 

if __name__ == "__main__": 
    root = tk.Tk() 
    Example(root).pack(fill="both", expand=True) 
    root.mainloop()