将matplotlib嵌入到tkinter应用程序中

时间:2017-03-02 07:19:02

标签: python matplotlib tkinter

我有一个程序在启动时会打开比特币价格的matplotlib图表,并会在每次价格变化时更新。然后当我关闭它时,全屏tkinter应用程序打开,背景图像和角落里的更新时钟。我想要发生的是当我启动程序时,全屏tkinter应用程序打开一个背景图像,角落里的更新时钟,中间的matplotlib图。基本上我想将matplotlib图嵌入到我的应用程序中。我已经尝试将图形代码放入我的类并调用它,但这只是给出了前面提到的结果。我尝试用此替换plt.show()

canvas = FigureCanvasTkAgg(fig, self) canvas.show() canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=True)

然后程序根本没有启动。无论我把它放在脚本的哪个位置,它都会出现像“自我”这样的错误。没有定义'当我用它直接替换plt.show()和''画布'没有定义'当我试图将它集成到课堂中时。以下是完整的代码:

from tkinter import *
from PIL import ImageTk, Image
import os
import time
import requests
import tkinter as tk
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
import matplotlib.animation as animation
from matplotlib import style
from tkinter import ttk
import urllib
import json
import pandas as pd
import numpy as np
from PyQt5 import QtWidgets

fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)

class App(tk.Tk):
    def __init__(self):
        # call the __init__ method of Tk class to create the main window
        tk.Tk.__init__(self)

        # background image
        img = ImageTk.PhotoImage(Image.open("0.png"))
        panel = Label(self, image=img)
        panel.pack()

        # clock
        self.label = tk.Label(self, text="", font=('comic',50,'bold'),
                          bg='#464545', fg='#1681BE')
        self.label.place(height=204, width=484, x=1384, y=824)       
        self.update_clock()

        # window geometry
        w, h = self.winfo_screenwidth(), self.winfo_screenheight()
        self.geometry("%dx%d+0+0" % (w, h))

        self.overrideredirect(True)
        self.mainloop()

    def update_clock(self):
        now = time.strftime('%H:%M:%S')
        self.label.configure(text=now)
        self.after(1000, self.update_clock)

    def animate(self): 

        dataLink = 'https://btc-e.com/api/3/trades/btc_usd?limit=2000d'
        data = urllib.request.urlopen(dataLink)
        data = data.read().decode("utf-8")
        data = json.loads(data)

        data = data["btc_usd"]
        data = pd.DataFrame(data)

        buys = data[(data['type']=="ask")]
        buys["datestamp"] = np.array(buys["timestamp"]).astype("datetime64[s]")
        buyDates = (buys["datestamp"]).tolist()

        plot(buyDates, buys["price"])

        xlabel('time')
        ylabel('Temperature')
        title('Temperature Chart')
        grid(True)


    ani = animation.FuncAnimation(fig, animate, interval=1000)

plt.show()
app = App()

有一些可靠的' 0.png'这是背景图像,当然还有许多模块,但任何反馈都会非常感激。

1 个答案:

答案 0 :(得分:0)

plt.show()将打开一个新的专用GUI窗口来托管matplotlib状态机中当前存在的图形。如果您不想这样,请不要使用plt.show() 要保存在最佳状态,最好不要使用pyplot,因为即使像plt.xticks()这样无辜的命令也可以cause a new window to open

另外,摆脱from pylab import *。 Pylab是一个构造,它在单个命名空间中包含几个包,如numpy和pyplot。这可能是交互式笔记本式应用程序所需要的,但对于脚本来说通常是个坏主意,因为它使调试非常麻烦。相反,尝试完全坚持使用matplotlib API命令。

linked question实际上是如何使用FigureCanvasTkAggNavigationToolbar2Tk将数字嵌入tk的示例。

更好的开始可能是查看matplotlib示例页面,其中显示minimal example for tk embedding