Внедрить граф matplotlib в класс виджета холста tkinter - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь создать небольшой tkinter GUI, который использует классы, как видно на этом канале site / youtube .

Моя программа через tk.Menu загрузит CSV-файл и напечатает график внутри холста. Если я загружу другой файл, график будет очищен и воссоздан с двумя строками. При добавлении нового файла будет увеличено количество линий на графике и так далее. У меня уже есть программа, которая делает это, но не использует классы. Ниже приведен вывод программы, которая использует только функции. Использование только функций

Использование классов дает мне отдельное окно, которое я хочу встроить в холст. Использование классов

Я думаю, что решение простое, но я не вижу его самостоятельно.

Мой код ниже:

f = Figure()

class StartPage(tk.Frame):
    def __init__(self,parent,controller):
        tk.Frame.__init__(self,parent)
        label = tk.Label(self,  text = "Start Page", font = SMALL_FONT)
        label.pack(pady=10, padx = 10)
        btn_About = ttk.Button(self, text="About!",
                            command=lambda: controller.show_frame(AboutPage))
        btn_About.place(relx = 1.0, rely = 0.0, anchor=NE)

        #Graph Canvas --> where the graph will show + navigation toolbar
        canvas = FigureCanvasTkAgg(f, self)
        canvas.draw()
        canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=True)

        toolbar = NavigationToolbar2Tk(canvas, self)
        toolbar.update()
        canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=True)

Функция для отображения графика:

def PlotGraph():
    global count
    plt.clf()

    # values taken every time a csv file is loaded
    TakeValues()    #x values are the same, y values are changing

    # change plot axis scale using numpy arange method
    plt.xticks(np.arange(0, max(xdata)))
    plt.yticks(np.arange(minLSB_err, maxLSB_err))

    if count != 0:
        for i in range(count + 1):
            label = filename_dict[i]
            plt.plot(xdata, ydata[i], label=label[:-4], lw=2)
    else:
        label = filename_dict[0]
        plt.plot(xdata, ydata, label=label[:-4], lw=2)


    plt.legend(bbox_to_anchor=(0, 1.02, 1, .102), loc=3,
             ncol=2, borderaxespad=0)
    plt.title("Total Error")
    plt.xlabel("Voltage Applied [V]")
    plt.ylabel("LSB deviation")

    plt.tight_layout()

    count = count + 1
    plt.draw()
    try:
        plt.show()
    except (AttributeError) as e:
        print("Error occured:",e)

[ОБНОВЛЕНИЕ] Где и откуда должен быть размещен PlotGraph () я должен назвать это? Теперь это так:

filemenu.add_command(label="Open", command=PlotGraph)    #Open CSV files

Спасибо.

1 Ответ

0 голосов
/ 07 февраля 2020

Как указывает @Henry Yik, использование Figure работает. Класс StartPage остается прежним, но я добавил следующий код:

f = Figure()
a = f.add_subplot(111)

также изменил функцию PlotGraph () следующим образом:

def PlotGraph():
    global count
    # values taken every time a csv   file is loaded
    TakeValues()  # x values are the same, y values are changing

    a.clear()

    # change plot axis scale using numpy arange method
    a.set_xticks(np.arange(0, max(xdata)))
    a.set_yticks(np.arange(minLSB_err, maxLSB_err))

    if count != 0:
        for i in range(count + 1):
            label = filename_dict[i]
            a.plot(xdata, ydata[i], label=label[:-4], lw=2)
    else:
        label = filename_dict[0]
        a.plot(xdata, ydata, label=label[:-4], lw=2)


    a.legend(bbox_to_anchor=(0, 1.02, 1, .102), loc=3,
             ncol=2, borderaxespad=0)
    a.set_title("Total Error")
    a.set_xlabel("Voltage Applied [V]")
    a.set_ylabel("LSB deviation")

    count = count + 1

    return f

PlotGraph () не включен в любом классе.

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