【发布时间】: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