2015-02-14 8 views
8

के साथ जीआईएफ में एनीमेशन चलाएं मैं Tkinter.PhotoImage का उपयोग कर एनिमेटेड gif खेलने की कोशिश कर रहा हूं, लेकिन कोई सफलता नहीं देख रही है। यह छवि प्रदर्शित करता है, लेकिन एनीमेशन नहीं। निम्नलिखित मेरा कोड है:टिंकर

root = Tkinter.Tk() 
photo = Tkinter.PhotoImage(file = "path/to/image.gif") 
label = Tkinter.Label(image = photo) 
label.pack() 
root.mainloop() 

यह एक विंडो में छवि प्रदर्शित करता है, और यही वह है। मैं सोच रहा हूं कि इस मुद्दे के पास Tkinter.Label के साथ कुछ करना है लेकिन मुझे यकीन नहीं है। मैंने समाधान की तलाश की है लेकिन वे सभी मुझे पीआईएल (पायथन इमेजिंग लाइब्रेरी) का उपयोग करने के लिए कहते हैं, और यह ऐसा कुछ है जिसे मैं उपयोग नहीं करना चाहता हूं।

जवाब के साथ

, मैं कुछ और कोड बनाया (अभी भी काम नहीं करता है जो ...), यहाँ यह है:

from Tkinter import * 

def run_animation(): 
    while True: 
     try: 
      global photo 
      global frame 
      global label 
      photo = PhotoImage(
       file = photo_path, 
       format = "gif - {}".format(frame) 
       ) 

      label.configure(image = nextframe) 

      frame = frame + 1 

     except Exception: 
      frame = 1 
      break 

root = Tk() 
photo_path = "https://stackoverflow.com/users/zinedine/downloads/091.gif" 

photo = PhotoImage(
    file = photo_path, 
    ) 
label = Label(
    image = photo 
    ) 
animate = Button(
    root, 
    text = "animate", 
    command = run_animation 
    ) 

label.pack() 
animate.pack() 

root.mainloop() 

सब कुछ के लिए धन्यवाद! :)

+1

इसके बजाय आप इसे का उपयोग एक 'Canvas' विजेट पर (' सी द्वारा एक 'Label' विजेट के साथ संलग्न कर के साथ करने के लिए अगर यह कुछ है जांच कर सकता है create_image (x, y, image = photo') – martineau

+0

मुझे नहीं पता कि मैं 'कैनवास' के साथ कुछ गलत कर रहा हूं लेकिन मुझे केवल मेरी छवि का निचला दायां कोने मिलता है और यह पिक्सेललेट दिखता है ... – Zizouz212

+1

प्राप्त करने का प्रयास करें यह एक गैर-एनिमेटेड छवि के साथ काम करने के लिए पहले, तो एक एनिमेटेड एक बाद में करने के लिए स्विच। – martineau

उत्तर

7

आपको एनीमेशन को स्वयं को कम से कम ड्राइव करना होगा। एक एनिमेटेड gif में एक फ़ाइल में कई फ्रेम होते हैं। पहले फ्रेम को लोड करता है लेकिन आप छवि बनाते समय इंडेक्स पैरामीटर पास करके विभिन्न फ्रेम निर्दिष्ट कर सकते हैं। उदाहरण के लिए:

frame2 = PhotoImage(file=imagefilename, format="gif -index 2") 

आप अलग PhotoImages में सभी तख्तों को लोड और फिर फ्रेम स्विच करने के लिए टाइमर ईवेंट का उपयोग दिखाया जा रहा है (label.configure(image=nextframe)) यदि। टाइमर पर देरी आपको एनीमेशन गति को नियंत्रित करने देती है। फ्रेम गणना को पार करने के बाद फ्रेम बनाने में असफल होने के अलावा आपको छवि में फ़्रेम की संख्या देने के लिए कुछ भी उपलब्ध नहीं है।

आधिकारिक शब्द के लिए photo टी मैनुअल पृष्ठ देखें।

+2

एक टी [Kludge] (https://en.wikipedia.org/wiki/Kludge) की तरह लगता है। – martineau

+0

और मुझे यह भी पूछना चाहिए कि छवि के लिए फ्रेम की संख्या निर्धारित करने का कोई तरीका है या नहीं; कोशिश की: http://stackoverflow.com/questions/7503567/python-how-i-can-get-gif-frames/7504131#7504131 इसके अलावा, 2500 छवियों के लिए, क्या इसे कभी भी स्वचालित बनाने का कोई तरीका है? – Zizouz212

+0

लेआउट के लिए http://en.wikipedia.org/wiki/GIF#Animated_GIF देखें। जीआईएफ फ़ाइल में कई फ्रेम नहीं होते हैं - केवल फ्रेम प्रति देरी जो परिवर्तनीय हो सकती है। – patthoyts

2

यहाँ एक वस्तु बनाने के बिना एक सरल उदाहरण है:

from tkinter import * 
import time 
import os 
root = Tk() 

frames = [PhotoImage(file='mygif.gif',format = 'gif -index %i' %(i)) for i in range(100)] 

def update(ind): 

    frame = frames[ind] 
    ind += 1 
    label.configure(image=frame) 
    root.after(100, update, ind) 
label = Label(root) 
label.pack() 
root.after(0, update, 0) 
root.mainloop() 
+2

क्या आप अपना कोड समझा सकते हैं, ताकि अन्य लोग उस कोड के कुछ टुकड़े की प्रतिलिपि बनाने और चिपकाने के बजाय सीख सकें जो काम कर सकता है या नहीं? – Robert

+0

ऐसा लगता है कि यह काम कर सकता है, लेकिन यह फ्रेम = फ्रेम [इंडेक्स] के लिए सीमा से बाहर एक सूची सूचकांक बाहर निकलता है –

संबंधित मुद्दे