将matplotlib嵌入到tkinter应用程序中

问题描述 投票:0回答:1

我有一个程序,在发布时将打开比特币价格的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()并且当我试图将它集成到类中时''canvas'没有被定义时,它会给出''self'未定义'之类的错误。以下是完整代码:

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'这是背景图像,当然还有很多模块,但任何反馈都会非常感激。

python matplotlib tkinter
1个回答
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的一个例子。

一个更好的开始可能是查看显示minimal example for tk embedding的matplotlib示例页面。

© www.soinside.com 2019 - 2024. All rights reserved.