PysimpleGUI - простая анимация

Спасибо за чтение этого.

Я работаю над простой анимацией, основанной на одном из двух примеров из кулинарной книги PysimpleGUI. Прикрепленный код, конечно, ничего не делает. Я просмотрел много примеров, пытаясь выяснить, как обновить холст, но безуспешно.

Моя первая попытка была основана на примере графика синусоидальной волны. У меня есть бесконечный цикл и функция отображения. Отображение в области графика показывает первую итерацию цикла, но после этого никогда не обновляется.

Функция отображения содержит:

graph.DrawCircle((i,j), 5, line_color='black', так далее

Второй связанный вопрос, должен ли я использовать метод canvas или graph (как в примере с графиком синусоидальной волны), или это не имеет значения?

Я не хочу перегружать читателя слишком большим количеством кода. Если я смогу заставить работать следующее, у меня будет хороший шанс с реальным кодом.

import PySimpleGUI as sg
import time

layout = [      
    [sg.Canvas(size=(100, 100), background_color='red', key= 'canvas')],      
    [sg.T('Change circle color to:'), sg.Button('Red'), sg.Button('Blue')]      
    ]

window = sg.Window('Canvas test')      
window.Layout(layout)      
window.Finalize()

canvas = window.FindElement('canvas')      
cir = canvas.TKCanvas.create_oval(50, 50, 100, 100)

while True:      
    event, values = window.Read()
    '''
    if event is None:      
        break      
    if event == 'Blue':      
        canvas.TKCanvas.itemconfig(cir, fill="Blue")      
    elif event == 'Red':      
        canvas.TKCanvas.itemconfig(cir, fill="Red")

    '''

# this is the part that I need to sort out

    for i in range(10):
        if i % 2 == 0:
            canvas.TKCanvas.itemconfig(cir, fill="Blue")

        else:
            canvas.TKCanvas.itemconfig(cir, fill="Red")

        time.sleep(1)    

2 ответа

Я обнаружил ответ, а именно, window.Read(timeout = 0).

Чтобы изменения отображались в окне после внесения изменений, вам нужно либо вызвать Read, либо Refresh. Я думаю, что все, что вам нужно сделать, это перейти в нижний цикл, добавить строку:

window.Refresh()

Из документов на http://www.pysimplegui.org/:

Обновить () Причины изменения окна, которое будет отображаться на экране. Обычно не требуется, если изменения не требуются немедленно или если до следующего вызова Read не пройдет много времени.

Другие вопросы по тегам