PysimpleGUI - простая анимация - PullRequest
0 голосов
/ 10 января 2019

Спасибо, что прочитали это.

Я работаю над простой анимацией, основанной на одном из двух примеров из кулинарной книги 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 ]

0 голосов
/ 11 января 2019

Я нашел ответ, то есть window.Read (timeout = 0).

0 голосов
/ 11 января 2019

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

window.Refresh()

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

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

...