2013-07-08 118 views
1

即時通訊設法使圖像在屏幕上滾動,直到它到達中間位置並停止。我怎樣才能做到這一點?我使用python 2.7與tkinter和PIL庫。Python照片動畫故障

感謝您的幫助!

+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,每個動畫一個。然後,只要打電話給他們你喜歡什麼。該方法獲取Label小部件的當前x位置,然後將其增加2.然後,調用root.update()來刷新窗口。讓我知道你是否需要任何額外的東西。

+0

而不是while循環,您可以使用'after'將圖像移動一個單位,然後讓方法使用'after'來安排自己在幾十毫秒內再次運行,具體取決於您希望它移動的速度。 –

+0

是真的!我不確定是否需要它,tkinter無法快速移動圖像 – mbdavis

+0

你是什麼意思,它不能快速移動圖像?你需要多快?我可以每隔幾毫秒左右將它移動儘可能多的像素。簡單的動畫大概可以達到60fps或更高。 –

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