将matplotlib嵌入到tkinter应用程序中
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将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()
并且当我试图将它集成到类中时''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'这是背景图像,当然还有很多模块,但任何反馈都会非常感激。
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实际上是如何使用FigureCanvasTkAgg
和NavigationToolbar2Tk
将一个数字嵌入tk的一个例子。
一个更好的开始可能是查看显示minimal example for tk embedding的matplotlib示例页面。
以上是关于将matplotlib嵌入到tkinter应用程序中的主要内容,如果未能解决你的问题,请参考以下文章
将matplotlib嵌入到tkinter画布中会打开两个窗口
深入浅出matplotlib(79):在tkinter应用程序里嵌入matplotlib绘图
Python Tkinter 在 GUI 中嵌入 Matplotlib