実現したいこと
YOUTUBEの配信の視聴中の人数をグラフにして表示したいが、更新されずに同じグラフしか表示されない。
5秒おきに視聴中の人数を取得して、折れ線グラフをリアルタイムでTkinterに表示させたい。
グラフの表示とデーの取得はできたが、Tkinterへの出力がうまいことできない。
発生している問題
エラーは出ないが、グラフが更新されない。
ソースコード
python
1# -*- coding: utf-8 -*- 2import time 3import datetime 4import requests 5import json 6import matplotlib.pyplot as plt 7import numpy as np 8from apiclient.discovery import build 9 10import tkinter as tk 11import matplotlib.pyplot as plt 12from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg, NavigationToolbar2Tk) 13 14 15YT_API_KEY = 'your youtube api key' 16youtube = build('youtube', 'v3', developerKey=YT_API_KEY) 17 18root = tk.Tk() 19root.title("graph????") 20root.geometry("1400x800") 21 22dt_now = datetime.datetime.now() 23now = str(dt_now.hour) + ":" + str(dt_now.minute) + ":" + str(dt_now.second) 24nowma = str(dt_now.hour) + ":" + str(dt_now.minute) + ":" + str(dt_now.second - 10) 25nowmae = str(dt_now.hour) + ":" + str(dt_now.minute) + ":" + str(dt_now.second - 5) 26 27 28def get_video_id(yt_url): 29 video_id = yt_url.replace('https://www.youtube.com/watch?v=', '') 30 print('video_id : ', video_id) 31 32 return video_id 33 34videos = [] 35yt_url = input('Input YouTube URL > ') 36Liveurl.append(yt_url) 37video_id = get_video_id(yt_url) 38video_response = youtube.videos().list( 39 part = 'snippet,liveStreamingDetails', 40 id = video_id 41).execute() 42 43for video_result in video_response.get("items", []): 44 if video_result["kind"] == "youtube#video": 45 videos.append([video_result["snippet"]["title"],video_result["liveStreamingDetails"]["concurrentViewers"]]) 46 47dataX = [nowma,nowmae] 48dataY = ['0','2'] 49def update(): 50 global dataY 51 for channel in videos: 52 print(channel) 53 print(dataX) 54 print(dataY) 55 fig = plt.figure() 56 plt.cla() 57 dataX.append(now) 58 dataY.append(str(channel[1])) 59 dataY = sorted(dataY) 60 plt.plot(dataX, dataY); 61 fig.savefig("img.png") 62 canvas = FigureCanvasTkAgg(fig, master=root) 63 canvas.draw() 64 root.after(5000, update) 65 66fig = plt.figure() 67plt.title("グラフ",fontname="MS Gothic") 68plt.xlabel("時間", fontname="MS Gothic") 69plt.ylabel("視聴中数", fontname="MS Gothic") 70dataY = sorted(dataY) 71plt.tight_layout() 72 73plt.plot(dataX, dataY); 74fig.savefig("img.png") 75 76canvas = FigureCanvasTkAgg(fig, master=root) 77canvas.draw() 78canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1) 79 80toolbar = NavigationToolbar2Tk(canvas, root) 81toolbar.update() 82canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1) 83 84root.after(5000, update) 85root.mainloop()
使用サイト
matplotlibまとめ
tkinterのウインド上にグラフを表示する
youtubeapi
###追加ソース
python
1dataX = [nowma,nowmae,nowmae] 2dataY = ['0','2','2'] 3def main(): 4 global dataY 5 fig = plt.figure() 6 plt.title("グラフ",fontname="MS Gothic") 7 plt.xlabel("時間", fontname="MS Gothic") 8 plt.ylabel("視聴中数", fontname="MS Gothic") 9 dataY = sorted(dataY) 10 plt.tight_layout() 11 12 plt.plot(dataX, dataY); 13 fig.savefig("img.png") 14 canvas = FigureCanvasTkAgg(fig, master=root) 15 16 canvas = FigureCanvasTkAgg(fig, master=root) 17 canvas.draw() 18 toolbar = NavigationToolbar2Tk(canvas, root) 19 toolbar.update() 20 canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1) 21 22 canvas.flush_events() 23 root.after_idle(5000, get_data) 24 25def get_data(): 26 time.sleep(5) 27 for channel in videos: 28 print(channel) 29 dataX.append(now) 30 dataY.append(str(channel[1])) 31 root.after_idle(5000, get_data) 32 33 34main() 35root.mainloop()
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/06 13:44
2021/06/06 13:55
2021/06/06 18:55
2021/06/09 03:21 編集