Невозможно вызвать canvas.show () - PullRequest
0 голосов
/ 04 мая 2018

Ошибка:

/ usr / bin / python3.5 /root/PycharmProjects/Capstone2/main.py Traceback (последний вызов был последним): Файл "/root/PycharmProjects/Capstone2/main.py", строка 62, в canvas.show () Файл "/usr/lib/python3/dist-packages/matplotlib/backends/backend_tkagg.py", строка 353, в чертеже self._master.update_idletasks () AttributeError: у объекта 'NoneType' нет атрибута 'update_idletasks' Процесс завершен с кодом выхода 1

Соответствующий код:

# GUI imports
from tkinter import *

# Graph imports
import matplotlib.pyplot as plt
import matplotlib
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
import matplotlib.animation as animation
from matplotlib import style

# Time imports
import time

def animate(i):
    a.clear()
    a.plot(data)

data = []

# GUI Set-Up
ROOT = Tk()
ROOT.attributes("-fullscreen", True)
matplotlib.use("TkAgg")
style.use('ggplot')
f = Frame(ROOT)
fig = Figure(figsize=(12, 7), dpi=100)

a = fig.add_subplot(221)
a.set_title("Data")

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

Frame.pack(f)

LOOP_ACTIVE = True
ROOT.config(cursor="none")

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

for x in range(0, 10):
    data.append(x)
    ROOT.update()
    time.sleep(1)

Мое понимание:

Каждую секунду следует добавить еще одну точку данных. Каждую секунду сюжет должен обновляться, чтобы отразить это.

Мои мысли:

  1. Из некоторых поисков в Google намекает, что AttributeError появляется, потому что я пытаюсь вызвать canvas.show, а canvas - это ничего, но я думаю, что моя строка "canvas = FigureCanvasTkAgg (fig)" верна, а более ранние строки, такие как "canvas.get_tk_widget () .pack (side = BOTTOM, fill = BOTH, expand = True) "не вызывает ошибок
  2. Если я опускаю «canvas.show ()», то ошибка возникает позже «Исключение в обратном вызове Tkinter»
  3. Если я изменю свой код так, чтобы canvas = FigureCanvasTkAgg (fig, master = ROOT) и соответствовал некоторым найденным примерам, ошибок не будет, но анимация никогда ничего не делает. Я не смог найти никакой документации по FigureCanvasTkAgg, только примеры, поэтому я не слишком уверен, что я делаю, изменив эту строку

Полный код можно увидеть здесь (предупреждение: это довольно грубый): https://github.com/AdamVen/Capstone/blob/fasterGraph/main.py

Код, на котором я базируюсь, находится здесь: https://pythonprogramming.net/how-to-embed-matplotlib-graph-tkinter-gui/

Я не уверен, куда я иду не так. Любой совет будет оценен

1 Ответ

0 голосов
/ 04 мая 2018

Некоторые части кода мне неясны: использование canvas.show() (которого даже не должно существовать) и использование plt.show() (что не имеет смысла, учитывая, что вы не создали ни одного цифра пиплота вообще)

Учитывая, что canvas = FigureCanvasTkAgg(fig, master=ROOT) используется в большинстве примеров, я не знаю, почему бы не использовать его.

Цикл в конце файла не кажется полезным. Вместо этого у вас есть цикл анимации для изменения ваших данных.

Наконец, вы забыли запустить программу, т.е. ROOT.mainloop().

from Tkinter import  *
import matplotlib
matplotlib.use("TkAgg")
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import matplotlib.animation as animation

# Data simulation imports
import time

def animate(i):
    a.clear()
    data.append(i)
    a.plot(data)

data = []

# GUI Set-Up
ROOT = Tk()
f = Frame(ROOT)

plt.style.use('ggplot')
fig = Figure(figsize=(12, 7), dpi=100)

a = fig.add_subplot(221)
a.set_title("Data")

canvas = FigureCanvasTkAgg(fig, master=ROOT)
canvas.get_tk_widget().pack(side=BOTTOM, fill=BOTH, expand=True)
canvas._tkcanvas.pack(side=TOP, fill=BOTH, expand=True)

Frame.pack(f)

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

ROOT.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...