简体   繁体   English

Pysimplegui 在图中使用 gif

[英]Pysimplegui use gifs in graph

Im trying to use gifs in my pysimplegui graph, but the gif dont move, there is any way to fix that?我试图在我的 pysimplegui 图中使用 gif,但是 gif 不动,有什么办法可以解决这个问题? I saw that there is a way to update animations, but i cant grab the graph image to update it, so what can i do?我看到有一种更新动画的方法,但是我无法抓取图形图像来更新它,我该怎么办? Also my screen read isnt blocking anything我的屏幕阅读也没有阻止任何东西

def criapersonagem(x,y):
    global local_personagem
    global personagem
    personagem = graph.draw_image(filename='personagemgif.gif',
                                  data=None,
                                  location=(x, y))
criarpersonagem(90,60)

thats how i created the image in the graph这就是我在图表中创建图像的方式

There're lot of frames in a GIF image, for animation, you have to get each frame shown as time passed. GIF 图像中有很多帧,对于 animation,您必须随着时间的推移显示每一帧。

Here's example to show how I do it.这是展示我如何做到这一点的示例。 Keyboard control, <Left><Right><Up><Down> , also work.键盘控制<Left><Right><Up><Down>也可以使用。 Remember to use your GIF file in code.请记住在代码中使用您的 GIF 文件。

import ctypes
import platform
import threading
from io import BytesIO
from time import sleep

from PIL import Image
import PySimpleGUI as sg

def image_to_data(im):
    with BytesIO() as output:
        im.save(output, format="PNG")
        data = output.getvalue()
    return data

def process_thread():
    global index
    while True:
        sleep(0.01)
        index = (index + 1) % frames
        window.write_event_value('Animation', index)

if platform.system() == "Windows":
    if platform.release() == "7":
        ctypes.windll.user32.SetProcessDPIAware()
    elif platform.release() == "8" or platform.release() == "10":
        ctypes.windll.shcore.SetProcessDpiAwareness(1)

im = Image.open("D:/1.gif")
width, height = im.size
frames = im.n_frames

graph_width, graph_height = size = (640, 640)

layout = [[sg.Graph(size, (0, 0), size, background_color='green', key='GRAPH')]]
window = sg.Window("Animation", layout, return_keyboard_events=True, finalize=True)

graph = window['GRAPH']
index = 0
im.seek(index)
data = image_to_data(im)
x, y = location = (graph_width//2-width//2, height)
item = graph.draw_image(data=data, location=location)

step = 20

thread = threading.Thread(target=process_thread, daemon=True)
thread.start()

while True:

    event, values = window.read(timeout=50)

    if event == sg.WINDOW_CLOSED:
        break
    elif event == 'Animation':
        im.seek(index)
        data = image_to_data(im)
        item_new = graph.draw_image(data=data, location=location)
        graph.delete_figure(item)
        item = item_new
    elif event == "Left:37":
        x = x - step if x >= step else x
        location = (x, y)
    elif event == "Right:39":
        x = x + step if x <= graph_width - width - step else x
        location = (x, y)
    elif event == "Up:38":
        y = y + step if y <= graph_height - step else y
        location = (x, y)
    elif event == "Down:40":
        y = y - step if y >= height + step else y
        location = (x, y)

window.close()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM