如何在Python中更新GUI窗口?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Python中更新GUI窗口?相关的知识,希望对你有一定的参考价值。

我的目标是要有一个窗口,提供当天股票更新的最新报价。我选择alpha_vantage作为报价源,选择pysimplegui创建窗口,然后扭曲以运行循环以每分钟更新一次窗口。该代码按编写的方式工作,打印正确的引号并进行更改,根据需要创建窗口,但该窗口不会更新。我有两个问题:

  1. 是否有更好的方法来做到这一点,更好的软件包选择等。我尝试了tkinter,但无法到达那里。
  2. 为什么窗口不更新?
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()
答案

我刚刚为我的大学做了一个非常类似的项目

我认为更好的方法是使用PyQt5。我的小组在PyQt5中断Anaconda安装方面遇到问题,但我们可以通过将IDE更改为其他内容来解决这个问题。

关于更新部分,我建议将数据写入/存储到csv,然后从中读取;因为这样不会不必要地填满内存。之后,您想进行无限循环以在更新数据后定期读取csv。

应该是这样。希望有帮助。

期待您解决这一问题,如果您需要我的帮助,我会在那里。

另一答案

答案:您的脚本没有多次调用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()
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. 添加了一个'Quit'事件,因此在关闭窗口时它实际上停止了。

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

以上是关于如何在Python中更新GUI窗口?的主要内容,如果未能解决你的问题,请参考以下文章

Python 3.5,单独窗口中的 pyqt5 进度条 gui

如何拍摄由 Python-tkinter 创建的正在运行的 GUI 窗口的快照并保存为图像文件(.jpeg/.png)?

GMSMarker 信息窗口内容(片段)未更新

Python GUI篇——关不掉的小窗口

如何只用一行 Python 代码制作一个GUI(图形界面)?

在 Python Tkinter 中,如何在 mainloop 窗口打开后运行代码? [复制]