Внедрение графика Python Pandas в виджет холста Tkinter GUI с виджетом update_idletasks - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь встроить сюжет с пандой в Ткинтер. Я могу показать это; однако я получаю AttributeError: у объекта 'NoneType' нет ошибки атрибута 'update_idletasks' при первом запуске и закрытии программы. Вот мой код:

import matplotlib
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib.figure import Figure
import pandas as pd
import tkinter as tk
import os
matplotlib.use("TkAgg")


LOCO_ANCHOR_DATA = "data_loco/loco_anchor"
POS_DATA = "data_loco/pos_data"


class ReportWindow:
    def __init__(self, master):
        self.master = master

        tk.Label(self.master, text="Report").grid(row=0, column=0)
        self.lf = tk.LabelFrame(self.master, text="Plot").grid(row=1, column=0, padx=3, pady=3)
        self.draw_plot()

    def draw_plot(self):
        fig = self.plot_data()

        canvas = FigureCanvasTkAgg(fig, master=self.lf)
        canvas.get_tk_widget().grid(row=1, column=0, padx=5, pady=5)

    def read_anchor_file(self, data_path=LOCO_ANCHOR_DATA):
        anchor_csv_path = os.path.join(data_path, "anchor_pos.csv")
        # print(pd.read_csv(csv_path))
        return pd.read_csv(anchor_csv_path)

    def read_pos_file(self, data_path=POS_DATA):
        pos_csv_path = os.path.join(data_path, "real_time_data.csv")
        # print(pd.read_csv(pos_csv_path))
        return pd.read_csv(pos_csv_path)

    def plot_data(self):
        fig = Figure(figsize=(5,4), dpi=100)
        plt.rc('grid', linestyle="--", color='black')
        axis = fig.add_subplot(111)
        anchor_pos_data = self.read_anchor_file()
        drone_pos_data = self.read_pos_file()
        drone_pos_data.plot(kind="scatter", x="xpos", y="ypos", alpha=0.4,
                            s=50, label="Real Time Position",
                            c="zpos", cmap=plt.get_cmap("jet"), colorbar=True, ax=axis)
        anchor_pos_data.plot(kind="scatter", x="y_direction", y="x_direction",
                             label="Anchor Positions",
                             color=(0, 0, 0), colorbar=False, ax=axis)
        plt.colormaps()
        plt.title("Flight Path Map")
        plt.grid(True)
        plt.legend(loc=0)
        # plt.show()
        return fig


if __name__ == '__main__':
    root = tk.Tk()
    report_gui = ReportWindow(master=root)
    root.mainloop()

Даже если я передаю объект Figure, почему я все еще получаю эту ошибку?

С наилучшими пожеланиями

РЕШЕНИЕ:

В python, когда вы делаете a (). B (), результатом выражения является то, что возвращает b (), поэтому LabelFrame (...). Grid (...) вернет None.

Таким образом, решение изменяет инициализацию LabelFrame следующим образом:

self.lf = tk.LabelFrame(self.master, text="Plot")
self.lf.grid(row=1, column=0, padx=3, pady=3)

Тогда я перестал видеть проблему "update_idletasks"

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