如何在 Python 中更新 GUI window?
How to update a GUI window in Python?
我的目标是 window 在白天更新股票的最新报价。我选择 alpha_vantage
作为引用来源,pysimplegui
创建 window 并扭曲到 运行 循环以每分钟更新 window。代码按编写的方式工作,打印正确的引用和更改,根据需要创建 window,但 window 不会更新。
为什么 window 没有更新?
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()
答案:
您的脚本未多次调用 paintQuote
。在那里添加打印行,你会发现它永远不会调用它超过一次。
建议的解决方案:
我不太了解 reactor
或 loopingCall
这件事,也不知道它是如何工作的。一个更简单的解决方案是使用一个带有 sleep 的 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)
我添加了一些调整,包括:
仅调用 "GLOBAL_QUOTE" 端点(因此您不会返回整个庞大的日内数据集)
删除 twisted
包以获得带有 time.sleep
函数的简单 while 循环。
添加了一个 'Quit' 事件,因此当您关闭 window 时它实际上停止了。
移除了paintQuote()
函数。我认为干净的代码最好不会删除此功能,但您可以根据需要将其重新添加。
删除了 pandas 集成。您没有处理大量数据操作,因此仅使用 JSON 格式更容易和更快。
我的目标是 window 在白天更新股票的最新报价。我选择 alpha_vantage
作为引用来源,pysimplegui
创建 window 并扭曲到 运行 循环以每分钟更新 window。代码按编写的方式工作,打印正确的引用和更改,根据需要创建 window,但 window 不会更新。
为什么 window 没有更新?
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()
答案:
您的脚本未多次调用 paintQuote
。在那里添加打印行,你会发现它永远不会调用它超过一次。
建议的解决方案:
我不太了解 reactor
或 loopingCall
这件事,也不知道它是如何工作的。一个更简单的解决方案是使用一个带有 sleep 的 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)
我添加了一些调整,包括:
仅调用 "GLOBAL_QUOTE" 端点(因此您不会返回整个庞大的日内数据集)
删除
twisted
包以获得带有time.sleep
函数的简单 while 循环。添加了一个 'Quit' 事件,因此当您关闭 window 时它实际上停止了。
移除了
paintQuote()
函数。我认为干净的代码最好不会删除此功能,但您可以根据需要将其重新添加。删除了 pandas 集成。您没有处理大量数据操作,因此仅使用 JSON 格式更容易和更快。