我的函数很困惑它是否需要第二个参数(python,matplotlib)

时间:2016-07-01 19:05:15

标签: python matplotlib tkinter

我正在使用Tkinter和Matplotlib在Python中编写(应该是)简单程序来控制机器。这是我的第一个Python程序,所以对任何令人震惊的非约定表示道歉,我欢迎所有反馈。此外,抱歉大代码块。

我试图拥有控件的主页面,以及在机器执行运行时显示图表的辅助页面。我设法让第二页显示并正确消失,然后显示图表。但是,每当它向图表添加一个点时,它都会向我大喊大叫

> 
Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python3.4/tkinter/__init__.py", line 1536, in __call__
    return self.func(*args)
  File "/usr/lib/python3.4/tkinter/__init__.py", line 585, in callit
    func(*args)
TypeError: graph_animate() missing 1 required positional argument: 'i'

所以我删除了",我"来自我的图形函数的参数所以它只需要(自我),然后它以不同的方式对我大喊:

> 
Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/local/lib/python3.4/dist-packages/matplotlib/figure.py", line 381, in show
    manager = getattr(self.canvas, 'manager')
AttributeError: 'FigureCanvasTkAgg' object has no attribute 'manager

后面是文件和模块中的一堆位置,以:

结尾
> 
....File "/usr/local/lib/python3.4/dist-packages/matplotlib/animation.py", line 1212, in _draw_frame
    self._drawn_artists = self._func(framedata, *self._args)
TypeError: graph_animate() takes 1 positional argument but 2 were given

我对Python中的故障排除不是很熟悉,但它看起来像是一个类型为catch-22的交易,我指定了另一个参数,它说我没有它,所以我把它拿出去了说它太多了。我花了相当多的时间来弄清楚发生了什么,以及如何在tkinter中指定构造函数,但我仍然无法修复错误。

import matplotlib
matplotlib.use("TkAgg")
import matplotlib.animation as animation
from matplotlib import style
import datetime
import time
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
import tkinter as tk
from tkinter import ttk, StringVar
import urllib
import json
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

f = Figure()
a = f.add_subplot(111)
gsFurnaceTemp = 0
plottime = []
plottemp = []

class BrokeApp:
    global gsFurnaceTemp
    def __init__(self, parent):

        self.myParent=parent
        self.root=parent

        self.myContainer1=tk.Frame(parent)
        self.myContainer1.pack()

        label = tk.Label(self.myContainer1, text = "My Broken App")
        label.grid(columnspan=4)
        buttonStart=tk.Button(self.myContainer1, text="Start Run",
                              bg='green', height=3, width=20,
                              command = self.btnStartClick)
        buttonStart.grid(row=7, column=1)

        self.ChillerLabelText = StringVar()
        self.ChillerLabelText.set(gsFurnaceTemp)
        lblChillerTemp = tk.Label(self.myContainer1, textvariable=self.ChillerLabelText)
        lblChillerTemp.grid(row=100, column=100)

        self.getDataTimer()

    def btnStartClick(self):
        self.newWindow=tk.Toplevel(self.myParent)
        self.app=GraphPage(self.newWindow)

    def getDataTimer(self):
        gsFurnaceTemp=open("TempTxt.txt", "r").read()
        self.ChillerLabelText.set(str(gsFurnaceTemp))
        self.root.after(1000, self.getDataTimer)


class GraphPage:
    global gsFurnaceTemp
    def __init__(self, parent):
        self.myParent=parent
        self.root=parent
        self.master=parent

        self.plottempz = []
        self.plottimez = []
        self.fz = Figure()
        self.az = self.fz.add_subplot(111)

        self.myContainer1=tk.Frame(parent)
        self.myContainer1.pack()

        label = tk.Label(self.myContainer1, text = "Temp Graph")
        label.pack(pady=10, padx=10)

        btnStartPage = ttk.Button(self.myContainer1, text="Back to Main Page",
                           command = self.close_Window)
        btnStartPage.pack(padx = 10, pady = 10)

        canvas = FigureCanvasTkAgg(self.fz, self.myContainer1)
        canvas.show()
        canvas.get_tk_widget().pack() 

        plottemp= []
        plottime= []

        ani = animation.FuncAnimation(self.fz, self.graph_animate, interval=1000)
        self.fz.show()


    def graph_animate(self, i):  #THIS IS THE LOCATION WHERE I REMOVE AND
                                 #INSERT THE ", i" WHICH HAS BEEN GIVING ME TROUBLES
        gsFurnaceTemp=open("TempTxt.txt", "r").read()
        plottemp.append(gsFurnaceTemp)
        self.az.clear()
        self.az.plot(plottemp)

        self.root.after(1000, self.graph_animate)

        gsFurnaceTemp=open("TempTxt.txt", "r").read()

    def close_Window(self):
        self.master.destroy()


def main():
    root = tk.Tk()
    app = BrokeApp(root)
    root.geometry("800x600")
    root.mainloop()
if __name__ == "__main__":
    main()

此外,抱歉,如果此代码中的任何一个是冗余的,或者我的任何声明的变量都未使用。我的大脑只是从弄清楚如何将它浓缩成一个足够短而且可编辑的大块程序中的大块而闻名。

Steeeeeve

1 个答案:

答案 0 :(得分:1)

我必须定义,你可以检查'帧'在FuncAnimation中的工作方式。我建议你阅读有关matplotlib.animation.FuncAnimation的文档。