#python #tkinter
#python #tkinter
Вопрос:
Я создал приложение для диалога с открытым файлом на Python с библиотекой tkinter:
class MainForm(Frame):
def __init__(self,parent):
Frame.__init__(self,parent)
self.parent=parent
self.InitUI()
def InitUI(self):
#===============#
self.frame1=Frame()
self.frame1.pack(fill=X)
self.lbl=Label(self.frame1,text="File Name")
self.lbl.pack(side=LEFT,padx=5,pady=5)
#===============#
self.frame2=Frame()
self.frame2.pack(fill=BOTH,expand=True)
self.text1_Text=StringVar()
self.text1=Entry(self.frame2,state=DISABLED,textvariable=self.text1_Text)
self.text1.pack(side=LEFT,anchor=NW,fill=X,expand=True,padx=5,pady=5)
#===============#
self.frame3=Frame()
self.frame3.pack(fill=BOTH,expand=True)
self.actBtn1=Button(self.frame3,text="Choose CSV File",command=lambda:[self.open_dialog(),self.open_csv_dataframe()])
self.actBtn1.pack(side=LEFT,padx=5,pady=5)
self.actBtn2=Button(self.frame3,text="Open",state=DISABLED,command=self.tes_dataframe)
self.actBtn2.pack(side=RIGHT,padx=5,pady=5)
#===============#
self.frame4=Frame()
self.frame4.pack(side=LEFT,anchor=N)
self.lbl2=Label(self.frame4,text="Information")
self.lbl2.pack(side=LEFT,padx=5,pady=5)
self.helpBtn=Button(self.frame4,text="How To Use The Program")
self.helpBtn.pack(side=LEFT,padx=5,pady=5,anchor=N)
self.aboutBtn=Button(self.frame4,text="About Program")
self.aboutBtn.pack(side=RIGHT,padx=5,pady=5,anchor=N)
#===============#
def open_dialog(self):
global fileName
try:
self.fileName=filedialog.askopenfilename(initialdir="/",filetypes=(("Comma-separated values","*.csv"),))
self.text1_Text.set(self.fileName)
except FileNotFoundError:
showerror("Error","The file is not selected yet")
def open_csv_dataframe(self):
if(self.actBtn2['state']==NORMAL):
self.actBtn2['state']=DISABLED
else:
self.actBtn2['state']=NORMAL
def tes_dataframe(self):
global df
data=pd.read_csv(self.text1.get(),sep=",")
df=pd.DataFrame(data)
root.destroy()
def on_close():
close = askokcancel("Close", "Do you want to exit?")
if close:
root.destroy()
sys.exit(1)
if __name__=='__main__':
root=Tk()
app=MainForm(root)
root.geometry("400x130 130 130")
root.resizable(False,False)
root.title("A Quite Complex File Dialog Form")
root.protocol("WM_DELETE_WINDOW", on_close)
root.mainloop()
Код, который я написал, кажется, без ошибок, но когда я пытаюсь выполнить эту часть:
def open_dialog(self):
global fileName
try:
self.fileName=filedialog.askopenfilename(initialdir="/",filetypes=(("Comma-separated values","*.csv"),))
self.text1_Text.set(self.fileName)
except FileNotFoundError:
showerror("Error","The file is not selected yet")
Я пытаюсь не выбирать файл csv, но сообщение об ошибке не появилось. Это должно выглядеть так:
Но он не появился,
Как сделать так, чтобы это появилось, я перепробовал много обходных путей, но результата не было.
Комментарии:
1. Вызывается
showerror
, когдаFileNotFoundError
вызывается в блоке «try». В вашем случае это исключение никогда не возникает, по крайней мере, в этом блоке «try» (потому что вы не открываете никаких файлов. Все, что вы делаете, это просто получаете имя файла и вставляете его вself.text1_Text
StringVar).
Ответ №1:
Существует много способов создания ошибок. Многие предпочли бы использовать raise
или assert
для этого.
поскольку вы использовали except для FileNotFoundError, вам обязательно нужно использовать raise
(errorName), и вы должны использовать это, когда len(self.fileName)=0 , то есть когда файл не выбран.
def open_dialog(self):
global fileName
try:
self.fileName=filedialog.askopenfilename(initialdir="/",filetypes=(("Comma-separated values","*.csv"),))
if len(self.fileName)==0:
raise FileNotFoundError
self.text1_Text.set(self.fileName)
except FileNotFoundError:
showerror("Error","The file is not selected yet")
Ответ №2:
если я правильно понимаю, проблема в том, что если вы принудительно вводите файл с другим расширением, вы хотите, чтобы программа сообщила вам.Таким образом, вы можете использовать функцию endswith, не вызывая исключения.
def open_dialog(self):
file = filedialog.askopenfilename(initialdir="/",filetypes=(("Comma-separated values","*.csv"),))
if file.lower().endswith(('.csv',)):
self.text1_Text.set(file)
else:
msg = "The file is not a csv file."
messagebox.showwarning(self.master.title(), msg, parent=self)
и переместите элемент управления в открывающееся
def tes_dataframe(self):
global df
if self.text1.get():
data=pd.read_csv(self.text1.get(),sep=",")
df=pd.DataFrame(data)
root.destroy()
else:
msg = "The file field is mandatory."
messagebox.showwarning(self.master.title(), msg, parent=self)
наконец…почему так много глобальных переменных…вы уверены, что вам это нужно?
Комментарии:
1. много глобальных переменных, которые вы сказали? Это для моего назначения, для открытия фрейма данных в консоли / терминале / CLI / независимо от имени …… не обращайте на это внимания :))