【问题标题】:Run Images in Loop Tkinter在 Loop Tkinter 中运行图像
【发布时间】:2018-10-01 02:12:13
【问题描述】:

我正在创建一个允许用户扫描票证并显示消息的应用程序。我创建了一个简短的 GIF 动画,当应用程序开始向用户展示在哪里扫描他们的票时播放。

我无法理解如何在 Python 3 中使用 tkinter 播放 GIF 图像。我尝试了很多解决方案,但遇到了一段代码,您可以在其中选择文件夹,并且该文件夹中的图像将循环播放,但是它不工作。

我想我不理解代码。这是我的应用程序代码:

from tkinter import *
from tkinter import messagebox
import tkinter.filedialog
from tkinter.filedialog import askdirectory
import requests
import simplejson as json
import os

#from json import JSONEncoder


#class MyEncoder(JSONEncoder):
    #def default(self, o):
         #return o.__dict__    


#Connect to API function

def apiconnect(statusvar):

    ticektid = e1.get()

    def to_serializable(ticketid):
        return str(ticketid)

    url = "https://staging3.activitar.com/ticket_api/tickets"
    data = {'ticket_id':e1.get(),'direction': 'up'}
    headers = {'Content-Type': 'application/json','Authorization' :'J0XDvDqVRy9hMF9Fo7j5'}
    r = requests.post(url,data=json.dumps(data), headers=headers)
    requestpost = requests.post(url, headers=headers, json=data)
    response_data = requestpost.json()
    statusvar = (response_data["status"])
    messagevar = (response_data["message"])
    json.dumps(url,data)
   # MyEncoder().encode(ticketid)
    #'{"ticekt_id": "/foo/bar"}'
#19 February 2018
#def from_json(json_object):
  #  if 'ticket_id' in json_object:
       # return FileItem(json_object['ticket_id'])
       # ticketid = JSONDecoder(object_hook = from_json).decode('{"ticket_id": "/foo/bar"}')

#Including GPIO config 
    if statusvar == "failed":
        messagebox.showinfo("Cape Point", messagevar)

    else: statusvar == "successful"



#Run at full screen automatically:
#---------------Function & Class--------------------------------#
class FullScreenApp(object):
    def __init__(self, master, **kwargs):
        self.master=master
        pad=3
        self._geom='200x200+0+0'
        master.geometry("{0}x{1}+0+0".format(
            master.winfo_screenwidth()-pad, master.winfo_screenheight()-pad))
        master.bind('<Escape>',self.toggle_geom)            
    def toggle_geom(self,event):
        geom=self.master.winfo_geometry()
        print(geom,self._geom)
        self.master.geometry(self._geom)
        self._geom=geom
#--------------------------------------------------------------------#

        def next_img():
            img_label.img = PhotoImage(file=next(imgs))
            img_label.config(image=img_label.img)

#create a textbox on a form
root = Tk()

#-----Full Screen-------#
app = FullScreenApp(root)


root.title("Cape Point")
root.configure(background = 'White')

#________ 下面这段代码是显示静态图像的原始代码_____#

#titlepic = PhotoImage(file = "ScanPlease.gif")         
#shownpic = titlepic
#filename = shownpic
#Label(root, image = filename).grid(row=0, sticky=W)

img_dir = askdirectory(parent=root, initialdir= "C:/Users/Nickitaes/Desktop", title='Where To Scan')
os.chdir(img_dir)
imgs = iter(os.listdir(img_dir))

img_label = Label(root)
img_label.bind("<Return>",next_img())

next_img()

e1 = Entry(root)


e1.grid(row=1, column=0)
e1.focus_set() #set cursor focus to textbox

e1.bind("<Return>", apiconnect) #Return function


root.mainloop( )

感谢您的帮助!

【问题讨论】:

    标签: python python-3.x tkinter raspberry-pi3 gif


    【解决方案1】:

    嗯...,在 StackOverflow 上不难找到关于此的其他问题。这里有一些:Play Animations in GIF with TkinterPlay an Animated GIF in python with tkinter

    我已经结合了不同数量的子图片的答案,还对代码进行了更多评论。

    from tkinter import *
    import time
    
    root = Tk()
    
    framelist = []          # List to hold all the frames
    for ix in range(1000):  # range > frames in largest GIF
        part = 'gif -index {}'.format(ix)
        try: frame = PhotoImage(file='giphy.gif', format=part)
        except:
            last = len(framelist) - 1   # Save index for last frame
            break           # Will break when GIF index is reached
        framelist.append(frame)
    
    def update(ix):  
        if ix > last: ix = 0    # Reset frame counter if too big
        label.configure(image=framelist[ix]) # Display frame on label
        ix += 1                 # Increase framecounter
        root.after(100, update, ix) # Run again after 100 ms.
    
    label = Label(root)
    label.pack()
    root.after(0, update, 0)    # Start update(0) after 0 ms.
    root.mainloop()
    

    根据您使用的 GIF 大小调整 for 循环,或重写为 while 循环。

    我不知道如何从 GIF 中读取帧延迟。您必须在 after() 中尝试不同的值,直到它看起来不错。

    【讨论】:

      猜你喜欢
      • 2017-05-03
      • 1970-01-01
      • 2021-02-24
      • 2011-04-20
      • 2019-02-21
      • 1970-01-01
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      相关资源
      最近更新 更多