Как обновить окно GUI в Python? - PullRequest
1 голос
/ 29 января 2020

Моя цель - иметь окно с последней цитатой обновления акций в течение дня. Я выбрал alpha_vantage в качестве источника цитаты, pysimplegui, чтобы создать окно, и повернулся, чтобы запустить al oop, чтобы обновлять окно каждую минуту. Код работает как написано, печатает правильную цитату и изменяет, создает окно по желанию, но окно не обновляется.

Почему окно не обновляется?

from alpha_vantage.timeseries import TimeSeries
from twisted.internet import task, reactor
import PySimpleGUI as sg

def paintQuote():
    quote, quote_meta = av.get_intraday(symbol='spy', interval = '1min')
    last = quote.iloc[-1][3]
    print('{0:6.2f}'.format(last))
    change = (last / yesterday - 1) * 100
    print('{0:4.2f}%'.format(change))
    event, values = window.read()
    window['quote'].update(last)

# window color
sg.theme('BluePurple')
# window layout
layout = [[sg.Text('last price', size=(20, 2), justification='center')],
            [sg.Text(''), sg.Text(size=(24,1), key='quote')]]
# create window
window = sg.Window('MikeQuote', layout)
wait = 60.0
av = TimeSeries(key ='your_key', output_format = 'pandas')
yest, yest_meta = av.get_daily(symbol='spy')
yesterday = yest.iloc[-2][3]
loop = task.LoopingCall(paintQuote)
loop.start(wait)
reactor.run()
window.close()

1 Ответ

2 голосов
/ 30 января 2020

Ответ: Ваш скрипт не вызывает paintQuote более одного раза. Добавьте туда строки для печати, и вы увидите, что он никогда не вызывает их более одного раза.

Предлагаемые решения: Я мало что знаю об этой reactor или loopingCall вещи или о том, как она работает. Более простое решение - просто использовать некоторое время l oop со сном в нем. Вот мое решение, которое, кажется, работает хорошо:

import PySimpleGUI as sg
from alpha_vantage.timeseries import TimeSeries
import time

sg.theme('BluePurple')

layout = [[sg.Text('Last Price', size=(20, 2), justification='center')],
          [sg.Text('', size=(10, 2), font=('Helvetica', 20),
                   justification='center', key='quote')]]

window = sg.Window('MikeQuote', layout)
av = TimeSeries(key = 'key')
spy, _ = av.get_quote_endpoint(symbol='SPY')
last = spy['05. price']
yest = spy['08. previous close']
wait = 1  # Wait is in seconds

while True:
    event, values = window.read(timeout=10)
    if event in (None, 'Quit'):
        break
    spy, _ = av.get_quote_endpoint(symbol='SPY')
    last = spy['05. price']
    window['quote'].update(last)
    time.sleep(wait)

Я добавил несколько настроек, в том числе:

  1. Вызов только конечной точки "GLOBAL_QUOTE" (так что вы не возвращает весь массивный внутридневной набор данных)

  2. Удалить пакет twisted для простого времени l oop с функцией time.sleep.

  3. Добавлено событие «Выход», чтобы оно фактически останавливалось при закрытии окна.

  4. Удалена функция paintQuote(). Я думаю, что в чистом коде в идеале эта функция не должна быть удалена, но вы можете добавить ее обратно так, как вам нравится.

  5. Удалена интеграция pandas. Вы не имеете дело с большими манипуляциями с данными, поэтому проще и быстрее использовать формат JSON.

...