tkinter如何在同一窗口中输出图表

nszi6y05  于 2021-08-25  发布在  Java
关注(0)|答案(0)|浏览(207)

我正在尝试创建一个tkinter gui,它可以根据这个下拉列表输出一个图表。这涉及到使用optionmenu,在这里我选择一个输入 Dataframe 。在选择 Dataframe 之后,我将它运行到一个名为function的函数中,该函数创建一个输出图表。
但是,输出图表与optionmenu下拉列表不在同一帧中输出。相反,它会为图表创建一个单独的窗口。此外,再次选择另一个下拉选项时,会创建更多窗口。
我不希望输出图表位于不同的窗口/框架上,而是希望它与选项菜单位于同一窗口上,并在每次选择其他下拉选项时替换输出图表。因此,在窗口中最多只能显示1个图表。

from tkinter import *

import plotly.graph_objects as go
from sklearn.linear_model import LinearRegression
import pandas as pd
import numpy as np
import datetime
from plotly.subplots import make_subplots

# plotly.offline.init_notebook_mode(connected=True)

import pandas as pd
import numpy as np
import matplotlib as mpl # optional (here)
import matplotlib.pyplot as plt
import seaborn as sns # Optional, will only affect the color of bars and the grid

from ipywidgets import widgets, interactive

import tkinter

from matplotlib.backends.backend_tkagg import (
    FigureCanvasTkAgg, NavigationToolbar2Tk)

# Implement the default Matplotlib key bindings.

from matplotlib.backend_bases import key_press_handler
from matplotlib.figure import Figure

import numpy as np
import os

files = os.listdir(path)

files

root = Tk()

oc = StringVar(root)
oc.set("Select")

def function(x):
    root = tkinter.Tk()

    inp = x
    new_total = pd.read_csv(path+inp,index_col=None,parse_dates=['Dates'])

    new_average = new_total.groupby(
        ['Dates']
    )['Price'].median().reset_index(name='Daily Average Price')

    new_average['Volume'] = new_total['Dates'].value_counts().sort_index(ascending=True).to_list()

    ############# Get line of best fit 

    from scipy import stats
    xi = np.arange(0,len(new_average['Dates']))
    y = new_average['Daily Average Price']
    slope, intercept, r_value, p_value, std_err = stats.linregress(xi,y)
    line = slope*xi+intercept

    plt.clf() 

    #fig = Figure(figsize=(9, 5), dpi=100)
    #fig.add_subplot(111).plot(new_average['Dates'], new_average['Daily Average Price'],'-o')

    #fig.add_subplot(111).plot(new_average['Dates'], new_average['Volume'])

    fig = plt.figure(1, figsize=(15,7),dpi=100)
    fig.suptitle(x+' Price', fontsize=20)
    barchart = plt.bar(new_average['Dates'], new_average['Volume'], color='lightgreen')
    plt.twinx()
    linechart = plt.plot(new_average['Dates'], new_average['Daily Average Price'], color='royalblue',label='Sum')
    linechart = plt.plot(new_average['Dates'], line, color='orangered',label='Sum')

    canvas = FigureCanvasTkAgg(fig, master=root)  # A tk.DrawingArea.
    canvas.draw()
    canvas.get_tk_widget().pack(side=tkinter.TOP, fill=tkinter.BOTH, expand=1)

    toolbar = NavigationToolbar2Tk(canvas, root)
    toolbar.update()
    canvas.get_tk_widget().pack(side=tkinter.TOP, fill=tkinter.BOTH, expand=1)

    def on_key_press(event):
        print("you pressed {}".format(event.key))
        key_press_handler(event, canvas, toolbar)

    canvas.mpl_connect("key_press_event", on_key_press)

    def _quit():
        root.quit()     # stops mainloop
        root.destroy()  # this is necessary on Windows to prevent
                        # Fatal Python Error: PyEval_RestoreThread: NULL tstate

    button = tkinter.Button(master=root, text="Quit", command=_quit)
    button.pack(side=tkinter.BOTTOM)

o = OptionMenu(root, oc, *files, command=function)
o.pack()

root.mainloop()

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题