2017-05-20 18 views
0

私は現在、基本的な株式プログラムに取り組んでおり、私のtkinterウィンドウ上のグラフ(過去1ヶ月間の株データ)を入手することができました。積極的に私のtkinterウィンドウを更新することは素晴らしいだろう! (FYI私はプログラミングに非常に新しいです、これはとても基本的な用語で説明してみてください、私の最初の年である!)HERESに私のコード:Tkinterでグラフを描く、Tkinterの情報を更新する

import numpy as np 
import datetime as dt 
import yahoo_finance as yf 
import matplotlib.pyplot as plt 
from Tkinter import * 
import quandl 

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 


root=Tk() 
root.geometry('1400x875') 
root.title("Stock Information") 


fmain=Frame(root, width=1400, height=900, bg='orange',bd=5) 
fmain.place(x=100, y=0) 

today=dt.date.today() 

thirty_day_graph_frame=Frame(fmain, width=645, height=400,bg='green4',bd=5) 
thirty_day_graph_frame.place(x=0, y=444) 

thirty_days=dt.timedelta(days=43) 
thirty_days_ago=today-thirty_days 


five_yrs_graph_frame=Frame(fmain, width=645, height=400, bg='yellow2',bd=5) 
five_yrs_graph_frame.place(x=655, y=444) 


five_years=dt.timedelta(days=1825) 
five_years_ago=today-five_years 


def stock_info(stock_name): 


    stock=yf.Share(stock_name) 
    stock_price=stock.get_price() 

    name_price_label=Label(fmain, text=(stock_name,':', stock_price),font=("Times New Roman",23)) 
    name_price_label.place(x=400, y=10) 

    day_high=quandl.get("WIKI/"+str(stock_name)+".2",start_date=str(today),end_date=str(today)) 

    high_price_label=Label(fmain, text=(str(day_high)), font=("Times New Roman",20)) 
    high_price_label.place(x=400, y=100) 


    thirty_day_data = quandl.get("WIKI/"+str(stock_name), start_date=str(thirty_days_ago), end_date=str(today),column_index=4) #So quandl.get gives a lot of info, so the column_index=4 is just getting closing prices 
    five_year_data = quandl.get("WIKI/"+str(stock_name),start_date=str(five_years_ago), end_date=str(today), column_index=4) 


    thirty_day_fig = plt.figure(figsize=(8,4)) 
    plt.plot(thirty_day_data) 
    canvas = FigureCanvasTkAgg(thirty_day_fig, master=thirty_day_graph_frame) 
    plot_widget = canvas.get_tk_widget() 
    plot_widget.place(x=0,y=0) 


    five_year_fig=plt.figure(figsize=(8,4)) 
    plt.plot(five_year_data) 
    canvas1=FigureCanvasTkAgg(five_year_fig, master=five_yrs_graph_frame) 
    plot_widget1=canvas1.get_tk_widget() 
    plot_widget1.place(x=1,y=0) 
    root.after(5000, stock_info, stock_name) 

apple_button=Button(root,text='AAPL', command=lambda:stock_info('AAPL')) 
tesla_button=Button(root,text='TSLA', command=lambda:stock_info('TSLA')) 
google_button=Button(root,text='GOOG', command=lambda:stock_info('GOOG')) 


apple_button.place(x=10, y=15) 
tesla_button.place(x=10, y=45) 
google_button.place(x=10,y=75) 

root.mainloop() 

答えて

2

あなたのグラフは最初からプロットされている理由は、方法のためでありますあなたassign commands to your buttons。この問題を解決する一つの方法は、ラムダ式のようにコマンドを割り当てることです:

apple_button = Button(root, text='AAPL', command=lambda:stock_info('AAPL')) 

時間をかけて自分のGUIの更新自体を聞かせするには、あなたがcreate a loop using the root.after() methodをすることができます:

# Define the figure and canvas outside the loop 
fig = plt.Figure() 
a = fig.add_subplot(111) 
canvas = FigureCanvasTkAgg(fig, master=f1) 
canvas.get_tk_widget().grid() 

def stock_info(stock_name): 
    # Get stock data and plot it on the GUI 
    ... 
    a.cla() 
    a.plot(data) 
    canvas.draw() 

    # Schedule the function to call itself again after 5 seconds 
    root.after(5000, stock_info, stock_name) 
+0

おかげで本当にクールthatsの!それがうまくいくように見えますが、私のグラフはちらつきがあります。それを防ぐ方法はありますか?私はしばらくしていないので、自分のコードをこのスレッドで更新してください。 – Addison

+0

あなたは大歓迎です。フレームを破壊して再作成し続けるので、グラフがちらつきます...これを防ぐには、フレームを作成してください私の返事でやったように** – Josselin

+0

私の関数でウィンドウのレクリエーションを取り除くとうまくいって、持ってきてください。関数の中に()を挿入すると、ランダムな間隔でリフレッシュされ、無作為に株式が切り替わります。私のコードを実行すると、あなたは見ることができます。それを更新する – Addison

関連する問題