如何解决一次运行后,Tkinter窗口自动关闭
因此,我正在编写一个界面,该界面将自动执行一些步骤“数据分析”。该代码涉及将用于不同功能的多个屏幕。我写的第一个是EDA(探索性数据分析)屏幕。该代码有效,但是将生成报告,然后仅关闭Tk窗口。
具体来说,当我生成报告时,代码将生成报告,然后关闭。我没有将代码生成放入其中,因为它不使用Tkinter。还没有列出其他屏幕,因为它们没有问题,我也不想将整个项目转储到这里。
import HTMLCreator as sv
from tkinter import *
import tkinter.filedialog
import time
import pandas as pd
import Credentials as cred
import os
class EDAScreen(Page):
def __init__(self,*args,**kwargs):
Page.__init__(self,**kwargs)
self.fields = ['First X Column Name','Last X Column Name','First Y Column name','Last Y Column Name']
self.entries = []
self.df=""
self.things=[]
self.description = "Automate EDA for a Dataset"
self.instructions = "Upload the CSV file with all the data"
self.descriptionLabel = Label(self,text = self.description,font=("System",13)).place(x = 140,y = 150)
self.instructionsLabel = Label(self,text = self.instructions,13)).place(x = 190,y =180)
self.genResultButton = Button(self,text = "Upload input file",font=("Arial",18),command = self.open).place(x = 290,y = 230)
self.edaButton=Button(self,text = "Generate Report",command = self.EDA).place(x = 290,y = 330)
# root.config(background='gray')
for ndex,field in enumerate(self.fields):
Label(self,width=20,text=field,anchor='w').grid(row=ndex,column=0,sticky='ew')
self.entries.append(Entry(self))
self.entries[-1].grid(row=ndex,column=1,sticky='ew')
Button(self,text='Set these Params',command=self.fetch).grid(row=len(self.fields)+1,sticky='ew')
def fetch(self):
for ndex,entry in enumerate(self.entries):
print('{}: {}'.format(self.fields[ndex],entry.get()))
self.things.append(entry.get())
def EDA(self):
sv.createHTML(self.df,self.things[:2],self.things[2:])
# Get the prediction answer by searching for file
def open(self):
filename = tkinter.filedialog.askopenfilename(parent=self,initialdir = "./",title = "Select file",filetypes = (("data files","*.csv"),("all files","*.*")))
print(filename)
self.df=pd.read_csv(filename)
cols=self.df.columns.values
print(cols)
try:
os.mkdir("./Breakdowns")
except :
pass
# print("Things: ",things)
#iv.processImg(r,'jpg')
当您没有主循环时,这似乎是一个问题。但是,我确实将其定义为:
if __name__ == "__main__":
root = Toplevel()
root.geometry("800x500")
main = MainView(root)
main.pack(side="top",fill="both",expand=True)
root.mainloop()
其他重要定义是
class Page(Frame):
def __init__(self,**kwargs):
Frame.__init__(self,**kwargs)
def show(self):
self.lift()
class MainView(Frame):
def __init__(self,**kwargs):
Frame.__init__(self,**kwargs)
introScreen = IntroScreen(self)
edaScreen = EDAScreen(self)
buttonFrame = Frame(self)
container = Frame(self)
buttonFrame.pack(side="top",fill="x",expand=False)
container.pack(side="top",expand=True)
edaScreen.place(in_ = container,x = 0,y = 0,relwidth = 1,relheight = 1)
introScreen.place(in_ = container,relheight = 1)
introScreenButton = Button(buttonFrame,text = "Go to Intro Screen",command = introScreen.lift,width = 30,height = 2)
edaScreenButton = Button(buttonFrame,text = "Understand your data in detail",command = edaScreen.lift,height = 2)
edaScreenButton.pack(side = "left")
introScreenButton.pack(side = "left")
introScreen.show()
class IntroScreen(Page):
def __init__(self,**kwargs)
self.backgroundImage = PhotoImage(file = "What is PD.png")
#^^ replace with something describing how to use the tool
backgroundLabel = Label(self,image = self.backgroundImage)
backgroundLabel.place(x = 0,relheight = 1)
编辑:我的createHTML如下所示。它与Tkinter无关(并且有效)。它在一个名为HTMLCreator的单独文件中。整个文件放在这里。我添加了import语句,以便您可以毫无问题地运行代码。
import pandas as pd
from pandas import Series
# from pygame import mixer # Load the required library
import seaborn as sns
import matplotlib.pyplot as plt
import glob
import sweetviz as sv
def createHTML(df,feature_cols,target_col):
"""
Create the HTML reports for the dataset given the names
Params:
df: dataframe passed,feature_cols: The independent variables (what you input)
target_col: The dependent vars (what you predict)
"""
data= df
##TODO Set the y_all and target_cols in a way that they get Tk input
y_all=data.loc[:,target_col[0]:target_col[1]]
target_col_names = data.loc[:,target_col[0]:target_col[1]].columns.values
for col in target_col_names:
X_all = data.loc[:,feature_cols[0]:feature_cols[1]]
# print(y_all[col])
X_all[col]=y_all[col]
# print(X_all[col])
advert_report=""
if(len(X_all.columns.values)>50):
advert_report = sv.analyze(X_all,pairwise_analysis="off",target_feat=col)
else:
print("here")
advert_report = sv.analyze(X_all,pairwise_analysis="on",target_feat=col)
#display the report
advert_report.show_html('Breakdowns/'+col+'.html')
advert_report = sv.analyze(y_all,pairwise_analysis="on")
#display the report
advert_report.show_html('Breakdowns/Preds'+'.html')
解决方法
在最初部分生成报告后,我确实遇到了一些问题,但是就我而言,Tk
窗口没有关闭。
该错误与HTMLCreator
文件中的以下几行有关:
if(len(X_all.columns.values)>50):
advert_report = sv.analyze(X_all,pairwise_analysis="off",target_feat=col)
else:
print("here")
advert_report = sv.analyze(X_all,pairwise_analysis="on",target_feat=col)
Sweetviz
目前仅根据文档支持BOOLEAN和NUMERICAL功能作为目标:
target_feat:一个字符串,表示要作为特征的名称 标记为“目标”。只能将BOOLEAN和NUMERICAL特征作为目标 现在。
因此,通过运行以下代码,不会显示错误:
if(len(X_all.columns.values)>50):
advert_report = sv.analyze(X_all,pairwise_analysis="off")
else:
print("here")
advert_report = sv.analyze(X_all,pairwise_analysis="on")
但是,仅将数字列作为target
传递仍然会奇怪地引发错误,但是如果列为FeatureConfig
对象,则可以使用feature_config = sv.FeatureConfig(force_num=col)
if(len(X_all.columns.values)>50):
advert_report = sv.analyze(X_all,feat_cfg=feature_config,target_feat=col)
对象作为替代方法来强制数字列的目标不是数字类型,您仍然会收到错误消息。
%%csharp
,
因此,在使用其他EDA工具(例如Pandas Profiling)之后,我已经找到了原因。显然,所有基于Pandas Profiling的程序在完成后(由于某种原因)只是在TKinter下。没有什么可以做的。
, mainloop()必须遵循被调用的函数(在您的情况下为数据分析)。
例如。
tk = Tk()
tk.title('Data Analysis')
data_analysis_func(args)
tk.mainloop()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。