Showerror не хочет появляться, но в коде, похоже, нет ошибок

#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 / независимо от имени …… не обращайте на это внимания :))