我已经检查了很多this one之类的StackOverflow帖子。但是,我无法解决问题。在第一页上,我正在选择感兴趣的功能。然后,在第二页上,我要绘制三个图。当我返回首页并选择其他功能时,图并没有改变。我试图清除轴self.update(),创建多个函数,但此刻我被困住了。希望有人可以帮助我,在此先感谢!
代码:
问题与覆盖/刷新图有关。起始页:
通过单击“显示”按钮,它将激活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)