如何在另一页上的Tkinter中更新情节?

时间:2020-07-20 13:22:10

标签: python python-3.x matplotlib tkinter

我已经检查了很多this one之类的StackOverflow帖子。但是,我无法解决问题。在第一页上,我正在选择感兴趣的功能。然后,在第二页上,我要绘制三个图。当我返回首页并选择其他功能时,图并没有改变。我试图清除轴self.update(),创建多个函数,但此刻我被困住了。希望有人可以帮助我,在此先感谢!

代码:

问题与覆盖/刷新图有关。起始页:

  1. 需要一个excel文件。
  2. 必须选择第一个功能
  3. 必须选择第二个功能 然后按显示按钮以创建一些图。

通过单击“显示”按钮,它将激活PageOne上的功能do_it。此功能是转到PageOne并绘制图形的组合。

通过def plot_overzicht(在PageOne上)完成图形的绘制。


class StartPage(tk.Frame):

    def __init__(self, parent, controller):
        self.controller = controller
        tk.Frame.__init__(self,parent)
        self.controller.geometry("200x360")
        label = tk.Label(self, text="Instelling", font=LARGE_FONT)
        label.pack(pady=10,padx=10)

        def file():
            self.filename =  filedialog.askopenfilename(initialdir = "/",title = "Select file",filetypes = (("xlsx","*.xlsx"),("all files","*.*")))
            self.ent1.insert(tk.END, self.filename)
            self.data_anton = pd.read_excel(self.filename,sheet_name = '6-maanden overzicht 2020',skiprows=1)
            return    
  
        self.button1 = tk.Button(self, text='File ', command=file,width = 10)
        self.button1.pack(side='top')
        self.ent1= tk.Entry(self,font=6,width = 12)
        self.ent1.pack(side='top')
        
        opleidingen = ['School Noord', 'School Zuid', 'KMS','School LMB','Operatielijn 2 SIVO','KMS Specials']
        statussen = ['Afgerond','Actueel']
         # List with options

        self.tkvar1 = tk.StringVar(self)
        self.popupMenu = tk.OptionMenu(self, self.tkvar1, opleidingen[0], *opleidingen[1:])
        self.label1 = tk.Label(self, text="Kies een instelling")
        self.label1.pack()
        self.popupMenu.pack()
        self.tkvar1.set('School Noord') # set the default option
        
        self.tkvar2 = tk.StringVar(self)
        self.popupMenu = tk.OptionMenu(self, self.tkvar2, statussen[0], *statussen[1:])
        self.label2 = tk.Label(self, text="Kies afgerond of actueel")
        self.label2.pack()
        self.popupMenu.pack()
        self.tkvar2.set('Afgerond') # set the default option
        


        
        self.button2 = tk.Button(self, text='Quit ', command=self.quit,width = 10)
        self.button3 = tk.Button(self, text='Show', command=lambda: PageOne.do_it(self,controller),width = 10)
        
        self.button2.pack(side='bottom')
        self.button3.pack(side='bottom')
        
        array = (self.tkvar1.get(), self.tkvar2.get())
        self.inst= array[0]
        self.status= array[1].lower()

第一页:按“显示”按钮应会创建三个图形。

class PageOne(tk.Frame):
    def __init__(self, parent, controller):
        self.controller = controller
        tk.Frame.__init__(self, parent)
        self.label = tk.Label(self, text="Grafieken", font=LARGE_FONT)
        self.label.pack(pady=10,padx=10)
        self.button1 = ttk.Button(self, text="Startpagina",
                            command=lambda: go_to_StartPage(self,controller))
        self.button1.pack()
        

    def plot_overzicht(self,inst,status,data_anton):
        if status == 'Afgerond':
            status = 'geslaagd'
            status_var = 'afgeronde'
        else:
            status = 'actueel'
            status_var = 'actuele'
        if inst =='School Noord':
            index_i = -1
        else:
            index_i = data_anton[data_anton[data_anton.columns[0]].str.contains(inst, na=False)].index[0]
        index_nan = np.where(data_anton[data_anton.columns[0]].isnull().values)[0]
        index_inan = index_nan[index_i < index_nan][0]
        data_instelling = data_anton.iloc[index_i+1:index_inan]



        afgerond =  data_instelling.loc[data_instelling['%'+str(status)].dropna().index]

        if 'School Zuid' in data_anton[data_anton.columns[0]].iloc[index_i]:
            afgerond = afgerond[afgerond[afgerond.columns[0]].str.find('instromers') < 0]

        afgerond[afgerond.columns[0]] = afgerond[afgerond.columns[0]].str.lower()
        afgerond.index = afgerond[afgerond.columns[0]].str.replace('initeel', 'initieel')

        geslaagd = afgerond['%'+status]*100
        niet_geslaagd = (np.repeat(100,len(geslaagd))) - geslaagd
        d = {'geslaagd':geslaagd, 'Niet geslaagd':niet_geslaagd}
        data_example = pd.DataFrame(data = d)
        # data_example.index = map(lambda x:x.lower(),afgerond[afgerond.columns[0]].values)

        total = geslaagd.append(niet_geslaagd)
        n_geslaagd = afgerond['geslaagd']
        opkomst = afgerond['opkomst']
        gem_geslaagd = (sum(n_geslaagd)/sum(opkomst))*100
        gem_niet_geslaagd = 100-gem_geslaagd


        figure1 = plt.Figure(figsize=(10,15),dpi=100)
        ax1 = figure1.add_subplot(311)

        data_example.plot(kind='barh',ax =ax1,color =[ 'green', 'red'])

        for i, v in enumerate(opkomst):
            q = geslaagd
            ax1.text(np.max(total)*1.1*0.5, i +0.2, 'Ntot = '+str(v), color='black', fontweight='bold')
        ax1.axvline(gem_geslaagd, 0, 1, label='Gemiddelde slagingspercentage',color = 'green')
        ax1.axvline(gem_niet_geslaagd, 0, 1, label='Gemiddelde uitvalspercentage',color = 'red')

        # plot legend
        plt.legend(loc='upper right', bbox_to_anchor=(1, 0.91))


        # plot axes and title
        ax1.set_xlim(0,np.max(total)*1.1)
        ax1.set_ylabel('{} {} lichtingen'.format(status_var,inst),fontsize=10)
        ax1.set_xlabel('Percentage (%)',fontsize=8)
        ax1.set_title('Slaag- en uitval percentage per {} {} lichting'.format(status_var,inst),fontsize=12)

        afgerond = afgerond.rename(columns={'motivatie': 'OEV Motivatie', 'beeldvorming': 'OEV Beeldvorming','medisch/fysiek': 'OEV medisch / fysiek',
                                            'Blessure IB-pel': 'Blessure IB',
                                            'fysiek': 'DB Fysiek', 'kennis': 'DB Kennis','motivatie.1': 'DB Motivatie', 'fysiek.1': 'WV Fysiek',
                                            'kennis.1':'WV Kennis', 'motivatie.2':'WV Motivatie' })
        afgerond = afgerond.loc[:, ~afgerond.columns.str.contains('^Unnamed')]
        redenen = afgerond.iloc[:,np.min(np.where(afgerond.columns.str.contains('OEV'))):]
        redenen = redenen.fillna(0)
        redenen.index =  map(lambda x:x.lower(),afgerond[afgerond.columns[0]].values)

        test1 = redenen.sum()/redenen.T.sum().sum()


        figure2 = plt.Figure(figsize=(10,15), dpi=100)
        ax2 = figure1.add_subplot(312)

        test1.sort_values().plot(kind='barh',ax =ax2,color = 'cornflowerblue')

        textstr = '\n'.join(('OEV : Op eigen verzoek','NOEV : Niet op eigen verzoek','WV : Watervallen','DB : Doubleren'))

        props = dict(boxstyle='round', facecolor='white', alpha=0.3)
        ax2.text(1.01, 0.99, textstr, transform=ax2.transAxes, fontsize=8,
                verticalalignment='top',bbox = props)

        ax2.set_ylabel('Redenen voor uitval',fontsize=10)
        ax2.set_xlabel('Percentage (%)',fontsize=8)
        ax2.set_title('Reden voor uitval verdeling van {} {} lichtingen'.format(status_var,inst),fontsize=12)



        figure3 = plt.Figure(figsize=(10,6), dpi=100)
        ax3 = figure1.add_subplot(313)
        test = redenen.div(redenen.sum(axis=1), axis=0)
        for c in range(0,len(redenen.columns)):
            q = test[redenen.columns[c]]
            for i, v in enumerate(q):
                val = sum(test.iloc[i,0:c])/sum(test.iloc[i])
                val2 = test.iloc[i,c]
                val3 = redenen[redenen.columns[c]].iloc[i]
                if val3 != 0:
                    ax3.text(val+0.5*val2, i-0.1, str(val3), color='black', fontweight='bold')
        redenen = redenen.div(redenen.sum(axis=1), axis=0)



        redenen.plot(kind='barh',ax =ax3,colormap='Paired',stacked=True,legend=False)
        ax3.legend(loc='upper right',fontsize=8,bbox_to_anchor=(1.3, 1.03))
        ax3.set_ylabel('{} {} lichtingen'.format(status_var,inst),fontsize=10)
        ax3.set_xlabel('Percentage (%)',fontsize=8)
        ax3.set_title('Reden voor uitval distributie per {} {} lichting'.format(status_var,inst),fontsize=12)
        figure1.tight_layout(pad=5.0)
        self.canvas = FigureCanvasTkAgg(figure1,self)
        self.canvas.draw() 
        self.canvas.get_tk_widget().pack(side='top',fill='both',expand='true')
        toolbar = NavigationToolbar2Tk(self.canvas, self)
        toolbar.update()

    def do_it(self,cont):
        go_to_PageOne(self, cont)
        pagina1 = self.controller.get_page(PageOne)
        start_page = self.controller.get_page(StartPage)
        inst = start_page.tkvar1.get()
        status = start_page.tkvar2.get()
        data_anton = start_page.data_anton
        pagina1.plot_overzicht(inst,status,data_anton)

0 个答案:

没有答案
相关问题