【问题标题】:How to update a GUI window in Python?如何在 Python 中更新 GUI 窗口?
【发布时间】:2020-05-15 06:43:35
【问题描述】:

我的目标是有一个窗口,在白天更新股票的最新报价。我选择alpha_vantage 作为引用源,pysimplegui 创建窗口并扭曲运行循环以每分钟更新窗口。代码按照编写的方式工作,打印正确的引用和更改,根据需要创建窗口,但窗口不会更新。

为什么窗口不更新?

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()

【问题讨论】:

  • 您可以进一步简化问题。不更新的窗口与作为股票报价的数据无关。例如,尝试在窗口中显示当前时间并为其创建一个minimal reproducible example

标签: python twisted pysimplegui alpha-vantage


【解决方案1】:

答案: 您的脚本没有多次调用paintQuote。在其中添加打印行,您会看到它不会多次调用它。

建议的解决方案: 我不太了解 reactorloopingCall 的事情或它是如何工作的。一个更简单的解决方案是使用一个带有睡眠的while循环。这是我的解决方案,似乎效果很好:

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 包以使用 time.sleep 函数进行简单的 while 循环。

  3. 添加了一个“退出”事件,因此当您关闭窗口时它实际上会停止。

  4. 删除了paintQuote() 函数。我认为干净的代码理想情况下不会删除此功能,但您可以根据需要将其重新添加。

  5. 删除了 pandas 集成。您无需处理大量数据操作,因此仅使用 JSON 格式更容易、更快捷。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 2019-11-30
    • 2012-12-05
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多