2017-03-02 214 views
0

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

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

但随后的程序没有启动的。无论我把它放在脚本中的哪个位置,都会给出像''self'没有被定义'的错误,当我直接用它替换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”,这是背景图像,当然还有很多模块,但任何反馈,将不胜感激。

+0

对不起,我没有提到这一点,但我使用的是python 3.5.2 –

+0

“但这也行不通。”不是一个足够的问题描述。您显示的代码没有*“与canvas相关的内容”*,它从从未使用过的'FigureCanvasTkAgg'的导入appart。这使得无法帮助你解决实际问题。考虑(重新)阅读[问]。你可以编辑你的问题,而不是在它下面写下评论。 – ImportanceOfBeingErnest

回答

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实际上是一个如何使用FigureCanvasTkAggNavigationToolbar2TkAgg嵌入一个数字到tk的例子。

更好的开始可能是看一下呈现minimal example for tk embedding的matplotlib示例页面。