【问题标题】:Displaying real time stock data in a scrolling table in Python在 Python 的滚动表中显示实时股票数据
【发布时间】:2021-05-02 10:40:53
【问题描述】:

我正在尝试制作一个独立的 GUI 应用程序来显示来自股票价格 API 的实时价格数据。由于有了 API,使这个程序基于 Python 变得更加容易。

来自股票域的股票数据从 API 流式传输并以设定的间隔(atm 大约 500 毫秒)存储。

我的目标是在股票创下新高或新低时插入该股票的价格信息。此外,需要根据价格(红色/蓝色)将行着色为不同的颜色

例如:

Time     | Ticker | Price 
11:00:00 | ABCD   | 109.50
11:00:50 | WXYZ   | 123.30
11:01:00 | ABCD   | 110.01
11:01:50 | EFGH   | 50.38

如您所想,这张表格很快就会被填满,并且在交易时间内会全天运行,因此需要跟上不断增加的内容。

目前,我一直在考虑使用 Tkinter,但是我对 GUI 相关的编程缺乏经验,所以我不确定它是否能够实现我想要的。我从虚拟数据和最坏的情况开始(每 100 毫秒添加一次)。它看起来已经相当缓慢了,所以我不确定这是否可行,尤其是在需要滚动条解决方法的情况下 (Adding a scrollbar to a group of widgets in Tkinter):

import tkinter as tk
import tkinter.ttk as ttk


class StockDisplay(tk.Frame):
    def __init__(self):
        tk.Frame.__init__(self)
        self.main_frame = tk.Frame()
        self.main_frame.bind("<Configure>", lambda e: self.my_canvas.configure(scrollregion=self.my_canvas.bbox("all")))
        self.main_frame.pack(fill=tk.BOTH, expand=1)

        self.my_canvas = tk.Canvas(self.main_frame)
        self.my_canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=1)

        self.my_scrollbar = ttk.Scrollbar(self.main_frame, orient=tk.VERTICAL, command=self.my_canvas.yview)
        self.my_scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

        self.my_canvas.configure(yscrollcommand=self.my_scrollbar.set)

        self.second_frame = tk.Frame(self.my_canvas)

        self.my_canvas.create_window((0, 0), window=self.second_frame, anchor="nw")

        self.height = 0
        self.init_table()
        self.add_row()

    def init_table(self):
        tk.Label(self.second_frame, text="Time",).grid(row=self.height, column=0, padx=10)
        tk.Label(self.second_frame, text="Ticker").grid(row=self.height, column=1, padx=10)
        tk.Label(self.second_frame, text="Price").grid(row=self.height, column=2, padx=10)

    def add_row(self):
        self.height += 1
        tk.Label(self.second_frame, text="Time").grid(row=self.height, column=0, padx=10)
        tk.Label(self.second_frame, text="Ticker " + str(self.height)).grid(row=self.height, column=1, padx=10)
        tk.Label(self.second_frame, text="Price").grid(row=self.height, column=2, padx=10)
        self.reset_scrollregion()
        self.after(100, self.add_row)

    def reset_scrollregion(self):
        self.my_canvas.configure(scrollregion=self.my_canvas.bbox("all"))


if __name__ == '__main__':
    root = tk.Tk()
    root.title('Tkicker')
    root.geometry("500x400")
    display = StockDisplay()
    root.mainloop()

我的问题是:

1.) Tkinter 能否实现我的目标?

a.) 如果是:是否有一个好的/更好的方法来允许这个更新表(即网格方法是最好的方法)?

b.) 如果没有:是否有更好的 GUI 应用程序可以用来实现此目的?

非常感谢任何建议。

谢谢!

【问题讨论】:

  • 您使用标签而不是文本小部件或画布是否有原因?你能做一些数学运算来准确地告诉我们你希望在一天结束时有多少行和列吗?数千?几十万?
  • 另外,您是想每秒添加行十次,还是只想更新几行十次一秒钟?
  • @BryanOakley 感谢您抽出宝贵时间回复第一次澄清,标签只是一个占位符,任何显示文本并允许字体颜色和背景颜色的小部件都可以。对于一个较大的上限,假设 100 只股票,它们每分钟创造 10 次新高/新低,所以我们将有 100 只股票 * (60/10) 次每分钟 * 60 分钟一小时 * 8 小时 = 288,000。但是,正如您可以想象的那样,一天的低点和高点主要是在一天的前几分钟形成的,并且在一天中它会减少。我需要添加这些行,而不是更新。

标签: python tkinter real-time display stock


【解决方案1】:

显示数十万个字符串的唯一方法是使用文本小部件。我不确定上限是多少,但我用 200,000 行测试了它,它似乎工作正常。您绝对不能创建 200,000 个标签小部件并期望 tkinter 以可用的方式执行。画布还对其可以管理的项目数量有限制。

您可以在文本小部件中配置制表位,以便您的数据在列中对齐。您可以使用标签为线条或线条的一部分添加颜色。

【讨论】:

  • 非常感谢,帮了大忙。我只需要了解制表位,我认为这可能是解决方案!
  • 我正在使用标签为每一行文本添加边框,以进一步“模拟”表格外观。然而,具有相同边框样式和宽度的连续标签似乎连接在一起,即使标签名称不同:self.output.tag_configure("1", background="lightyellow", borderwidth=1, relief="solid") self.output.tag_configure("2", background="lightyellow", borderwidth=1, relief="solid") self.output.tag_configure("3", background="lightblue", borderwidth=1, relief="solid") self.output.tag_configure("4", background="lightblue", borderwidth=1, relief="solid")
  • 我现在随机添加它们,如下所示:self.output.tag_add(str((self.count % 4) + 1), str(float(self.count+1)), str(float(self.count + 2))) 其中 count 是当前添加的股票价格数量。如果我更改颜色或边框宽度,它们是连续添加的,但似乎合并了相似的标签,我不确定是否有办法解决这个问题。
  • @ACWalker:这是一个完全不同的问题,我无法在评论部分回答。但是,是的,连续的字符将与您所说的相同的标签“加入”。
  • 我的错,我会问另一个问题,看看是否有更好的方法来解决这个问题。
猜你喜欢
  • 2022-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多