创建一个GUI,它在python中更新信息本身

时间:2016-02-02 15:49:19

标签: python excel tkinter

我正在为显示股票价格的竞争创建一个python程序,股票价格每分钟都要更新一次。我有一张excel表,我需要每分钟同步价格。为此,我使用了openpyxl外部库。

我已经成功创建了核心程序,但是当它在GUI上实现它时我很难被卡住。我不知道如何创建一个tkinter GUI,在每次循环迭代结束时更新价格,

这里的代码到现在为止(我知道它可以更好,但明天我必须提供它,它只是一次性的事情,所以它不重要) -

UPDATE 用户无需与软件交互。我只需要格式化时尚外观。

#GUI
app = Tk()
app.title("Trading Times 2016")
app.geometry('768x720')

#Execution
Raw = 3
timer = 1
int(Raw)
while Raw != 141:
os.system('CLS')
#timer
print("Time - %i" %timer)
timer += 1
#Currency
print("\n")
print("Dollar -", currency["C%d" %Raw].value)
print("Pound -", currency["E%d" %Raw].value)
print("Euro -", currency["G%d" %Raw].value)
print("Yuan -", currency["I%d" %Raw].value)
#Commodity
print("\n")
print("Gold per 100gm -", commodity["C%d" %Raw].value)
print("Wheat per Quintal -", commodity["E%d" %Raw].value)
print("Silver per Kg -", commodity["G%d" %Raw].value)
print("Crude per Barrel -", commodity["I%d" %Raw].value)
#Bonds
print("\n")
print("Bonds -", bonds["C%i" %Raw].value)
percent =  bonds["E%i" %Raw].value
int(percent)
print("RBI Bonds Yield(In Per Cent) - %i" %percent)
#ETF's
print("\n")
print("Small Cap Index -", etf["B%d" %Raw].value)  
print("Junior BEES -", etf["C%d" %Raw].value)
print("Bank BEES -", etf["D%d" %Raw].value)
print("PSUBNK BEES -", etf["E%d" %Raw].value)
print("CPSTTEF -", etf["F%d" %Raw].value)
print("Infra BEES -", etf["G%d" %Raw].value)           
print("Nifty BEES -", etf["H%d" %Raw].value)
print("SENSEX -", etf["I%d" %Raw].value)
#Mutual Funds
print("\n")
print("ABC -", mutual_funds["B%d" %Raw].value)
print("DEF -", mutual_funds["C%d" %Raw].value)
print("TNC -", mutual_funds["D%d" %Raw].value)     
print("KFJ -", mutual_funds["E%d" %Raw].value)
print("YWU -", mutual_funds["F%d" %Raw].value)
print("QNV -", mutual_funds["G%d" %Raw].value)
print("NBV -", mutual_funds["H%d" %Raw].value)
print("KAS -", mutual_funds["I%d" %Raw].value)
print("AYD -", mutual_funds["J%d" %Raw].value)
print("IT FUND -", mutual_funds["K%d" %Raw].value)
print("PHARMA -", mutual_funds["L%d" %Raw].value)
print("FMCG -", mutual_funds["M%d" %Raw].value)
#Shift Raw
Raw += 1
time.sleep(60)
app.mainloop()

任何人都可以帮我实现一个可以每分钟更新自己的GUI。 谢谢

3 个答案:

答案 0 :(得分:1)

使用Tkinter的after命令在X毫秒后运行一个函数(参见thisthis)。至于GUI本身,您需要使用一系列更新的标签,或者最好使用看起来更好的ttk.TreeView小部件。

答案 1 :(得分:1)

Tkinter小部件支持一种方法,在该方法之后,在给定的间隔im毫秒之后调用一个函数。它只是近似但可能对你来说足够好。这可能会告诉你我的意思。原谅任何格式问题 - 这是我在这里的第一篇文章。

将tkinter导入为tk

class App(tk.Tk):

def __init__(self):
    tk.Tk.__init__(self)

    self.counter  = 0
    self.str_counter = tk.StringVar()
    tk.Label(self,textvariable = self.str_counter).pack()

    self.after(1000,self.bump)
    self.mainloop()

def bump(self):
    self.counter += 1
    self.str_counter.set(str(self.counter))

    self.after(1000,self.bump)

应用()

答案 2 :(得分:0)

您似乎对GUI程序的工作方式存在根本性的误解。你不应该创建自己的while循环。 Tkinter(和其他GUI工具包)有一个需要运行的自定义while循环。

原因是,为了使GUI工作,它需要能够处理事件。即使是在另一个窗口移动时重绘窗口这样简单的事情也是对事件的响应。

在Tkinter中,此事件处理器为mainloop。如果mainloop没有运行(在你调用它之前,如果你的程序正在休眠,如果你有自己的长时间运行代码,...),它就无法处理事件。如果它无法处理事件,则无法更新屏幕。

你可以认为mainloop只不过是一个看起来像这样的无限循环:

while the_app_is_running:
    event = wait_for_next_event()
    process_event(event)

注意:你实际上并没有编写上面的代码,而是隐喻这就是调用mainloop的内容。

在您的情况下,您希望显示屏每分钟更新一次。利用此事件循环很容易做到这一点。事件循环已经在运行,因此您需要做的就是告诉它每分钟唤醒一次并更新其数据。您可以使用after方法执行此操作。为此方法指定要调用的函数的名称和延迟,并在延迟后调用该函数。它通过在事件队列上放置基于时间的事件来实现此目的。

第一步是使用所有小部件设置显示。例如:

app = Tk()
...
dollar_label = Label(app, text="")
pound_label = Label(app, text="")
...

下一步是创建一个函数,用所需的值填充所有标签。在创建标签的单独步骤中执行此操作非常重要,因为您希望每分钟都能执行此操作。

def refresh_display():
    # First, get the new data
    currency = ...
    commodity = ...
    ...
    # next, update the widgets
    dollar_label.configure(text="Dollar: %s" % currency["dollar"]
    pound_label.configure(text="Pound: %s" % currency["pound"]
    ...

最后,你想每分钟调用一次这个函数。你可以通过编写一个调用refresh_display函数的函数来做到这一点,然后安排自己在60秒内再次运行:

def call_every_60_seconds():
    refresh_display()
    app.after(60000, call_every_60_seconds)

最后一步是在启动mainloop之前通过调用此函数一次开始更新。这将使用初始值更新显示,然后在此之后每分钟开始运行计划。

call_every_60_seconds()
app.mainloop()

这是你必须要做的基础知识。它非常简单,只需要对代码进行一些组织。