2017-05-14 3 views
1

私は、在庫のチャートを描く簡単なアプリケーションを作っています。私はヤフーファイナンスから株式データを取得しているので、株式の「動的な」選択を管理することはできません。 私はアプリケーションの実行中に株式を選択し、コンパイルする前に在庫の名前を設定を取り除く場合ので、私の「generateChard」機能が正常に動作することを確信している - それは私がアニメーションを追加することで、この問題を解決するために管理matplotlibとtkinterを使った動的な描画チャート

import matplotlib 

matplotlib.use("TkAgg") 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg 
from matplotlib.figure import Figure 
import matplotlib.animation as animation 
import matplotlib.pyplot as plt 
from matplotlib import style 
import matplotlib.dates as mdates 

import tkinter as tk 
from tkinter import * 

import urllib 
import json 

import pandas as pd 
import numpy as np 

style.use("dark_background") 

LARGE_FONT = ("Verdana", 12) 

f = Figure(figsize=(5, 5), dpi=100) 
graph = f.add_subplot(111) 


def bytespdate2num(fmt, encoding='utf-8'): 
    strconverter = mdates.strpdate2num(fmt) 

    def bytesconverter(b): 
     s = b.decode(encoding) 
     return strconverter(s) 

    return bytesconverter 


def generateChart(stock): 
    graph.clear() 
    stockPriceUrl = 'http://chartapi.finance.yahoo.com/instrument/1.0/' + stock + '/chartdata;type=quote;range=6m/csv' 

    sourceCode = urllib.request.urlopen(stockPriceUrl).read().decode() 

    stockData = [] 
    splitSource = sourceCode.split('\n') 

    for line in splitSource: 
     splitLine = line.split(',') 
     if len(splitLine) == 6: 
      if 'values' not in line and 'labels' not in line: 
       stockData.append(line) 

    date, closePrice, highPrice, lowPrice, openPrice, volume = np.loadtxt(stockData, delimiter=',', unpack=True, 
                      converters={0: bytespdate2num('%Y%m%d')}) 
    graph.plot_date(date, closePrice, '') 


class StockAnalyser(tk.Tk): 
    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 
     container = tk.Frame(self) 

     tk.Tk.wm_title(self, "Stock Analyser") 
     tk.Tk.minsize(self, width=350, height=200) 

     container.pack(side="top", fill="both", expand=True) 

     container.grid_rowconfigure(0, weight=1) 
     container.grid_columnconfigure(0, weight=1) 

     self.frames = {} 

     for F in (StartPage, StartPage2): 
      frame = F(container, self) 
      self.frames[F] = frame 
      frame.grid(row=0, column=0, sticky="nsew") 

     self.show_frame(StartPage) 

    def show_frame(self, cont): 
     frame = self.frames[cont] 
     frame.tkraise() 


class StartPage(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     label = tk.Label(self, text="Pick graph stock exchange", font="LARGE_FONT") 
     label.pack(pady=10, padx=10) 

     stockEntry = tk.Entry(self) 
     stockEntry.pack() 

     button = tk.Button(self, text="next", 
          command=lambda: prepChart()) 
     button.pack() 

     def prepChart(): 
      generateChart(stockEntry.get()) 
      controller.show_frame(StartPage2) 


class StartPage2(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     label = tk.Label(self, text="Graph page", font="LARGE_FONT") 
     label.pack(pady=10, padx=10) 

     button = tk.Button(self, text="back to home page", 
          command=lambda: controller.show_frame(StartPage)) 
     button.pack() 

     canvas = FigureCanvasTkAgg(f, self) 
     canvas.show() 

     toolbar = NavigationToolbar2TkAgg(canvas, self) 
     canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=True) 
     canvas._tkcanvas.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True) 
     toolbar.update() 


app = StockAnalyser() 
app.mainloop() 
+0

http://stackoverflow.com/questions/4098131/how-to-update-a-plot-in-matplotlib/4098938#4098938 –

+0

ありがとう!私はこの問題を、アニメーションを実行するかどうかを決定する 'アニメーション'機能とフラグを追加することで解決しました。たぶんそれは最高のオプションではありませんが、フラグの作品は完璧です:) – ares1337

答えて

0

正常に動作します関数。

def animate(self): 
    if boolStartRefreshingData==True: 
     generateChart() 

ani = animation.FuncAnimation(figure,animate,10) 

ボタンがクリックされたときに、私がtrueにフラグの値を変更しています、そして私がfalseに変更:boolStartRefresingDataを、また、私はこのような何かを行うことができます世界の株式名を設定する - 私は、グローバルフラグを作成しましたグラフを描画する関数の最後

関連する問題