Как использовать Tkinter Scale для привязки и отображения столбца Pandas DataFrame в Matplotlib Chart? - PullRequest
1 голос
/ 28 марта 2019

Я строю графический интерфейс для отображения данных, используя Tkinter (здесь урезано).Цель состоит в том, чтобы использовать ползунок шкалы Tkinter для выбора и перемещения между столбцами в кадре данных Pandas, а также отображать выбранный столбец данных в виде встроенной диаграммы MatplotLib.Однако у меня возникли огромные проблемы с привязкой ползунка Масштаб к выбору столбца Pandas DataFrame и отображению диаграммы.С событием из шкалы Tkinter (S1) вызываемая функция (fromScale) должна обновить переменную класса (displayField), которая затем обновляет строку (dField), которая является индексом столбца в Pandas DataFrame (dar_MAST) для отображенияво встроенном графике.Любая помощь в переопределении привязки, чтобы позволить перемещению ползунка Scale, чтобы позволить «прокрутку» по столбцам отображаемых данных фрейма данных, была бы чрезвычайно признательна, прежде чем я сойду здесь с ума… (используя Python 3.6.5, PyCharm) Заранее спасибо

Перепробовал множество конфигураций «привязок» Tkinter и командных функций, глобальных переменных и переменных класса, но ни одна из них не работает.Здесь используется переменная класса, но все еще не может обновить отображение диаграммы

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import tkinter as tk
from tkinter import *
from tkinter import ttk
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg

class dar(Frame):
    displayField = 0   # Class variable to identify the column in the dataframe to display

    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.master = master
        self.init_window()
        container = Frame(self)
        container.pack(side='top', fill='both', expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

    def init_window(self):
        self.master.title('dar_FN')
        content = ttk.Frame(root, padding=(3, 3, 3, 3))

        dField = 'Fld_' + str(dar.displayField)  # Column index for dataframe display

        datas = np.random.uniform(size=(100, 10))  # Dummy random dataset
        dar_MAST = pd.DataFrame(datas, columns=['Fld_0', 'Fld_1', 'Fld_2', 'Fld_3', 'Fld_4', 'Fld_5', 'Fld_6', 'Fld_7',
                                                'Fld_8', 'Fld_9'])

        frame6 = ttk.Notebook(content, width=465, height=150)   # Frame containing Scale Slider
        frame6_tab1 = ttk.Frame(frame6)
        frame6.add(frame6_tab1, text='tp Selection')
        frame6_tab1_canvas = tk.Canvas(frame6_tab1, width=464, height=145)  # creates MAX canvas in tab
        frame6.grid_rowconfigure(0, weight=1)
        frame6.grid_columnconfigure(0, weight=1)
        frame6_tab1_canvas.grid(column=20, row=60)

        S1 = Scale(frame6_tab1_canvas, from_=0, to=9, orient=HORIZONTAL, length=360,   # THE SCALE SLIDER
                   highlightcolor='lightblue', tickinterval=100, command=self.fromScale)
        S1.grid(row=1, column=1, columnspan=10)

        self.update_idletasks()

        frame1a = ttk.Notebook(content, width=480, height=750)   # Frame containing data display
        frame1a_tab1 = ttk.Frame(frame1a)
        frame1a.add(frame1a_tab1, text='1a')
        frame1a_tab1_canvas = tk.Canvas(frame1a_tab1, width=470, height=745)
        frame1a_tab1_canvas.grid(column=0, row=20, sticky='nsew')
        frame1a_tab1_chart = plt.figure(figsize=(4.55, 7.46), dpi=100)
        f1at1 = plt.subplot2grid((20, 25), (0, 0), rowspan=20, colspan=25)
        f1at1.grid(True)
        f1at1.set_ylim(0, 100, auto=False)

        f1at1.plot(dar_MAST[dField], dar_MAST[dField].index, linewidth=1, label=dField)
        f1at1.legend()

        canvas_f1at1 = FigureCanvasTkAgg(frame1a_tab1_chart, frame1a_tab1_canvas)
        canvas_f1at1.draw()
        canvas_f1at1.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=True)

        content.grid(column=0, row=0, sticky=(N, S, E, W))
        frame1a.grid(column=0, row=0, columnspan=3, rowspan=1, sticky=(N, S, E, W))
        frame6.grid(column=0, row=1, columnspan=3, rowspan=1, sticky=(N, S, E, W))
        root.columnconfigure(0, weight=1)
        root.rowconfigure(0, weight=1)

    def fromScale(self, val):   # Function to update Class displayField value from Scale Slider event
        dar.displayField = int(val)  # Update Class variable displayField

root = Tk()
app = dar(root)
app.mainloop()

Каждое движение ползунка Масштаб должно изменить отображаемую диаграмму данных на следующий или соответствующий столбец данных в кадре данных dar_MAST, но только наотображаются данные первого столбца, т.е. без привязки?

...