tkfiledialog example askopenfilename python python-3.x tkinter global-variables filedialog

python - example - tkinter dialog message



filedialog, tkinter y archivos de apertura (3)

Estoy trabajando por primera vez en la codificación de un botón Examinar para un programa en Python3. He estado buscando en Internet y en este sitio, e incluso en la biblioteca estándar de Python.

He encontrado ejemplos de código y explicaciones muy superficiales de las cosas, pero no he podido encontrar nada que resuelva el problema que tengo directamente, o una explicación lo suficientemente buena como para poder personalizar el código según mis necesidades.

Aquí está el fragmento relevante:

Button(self, text = "Browse", command = self.load_file, width = 10)/ .grid(row = 1, column = 0, sticky = W) ..... def load_file(self): filename = filedialog.askopenfilename(filetypes = (("Template files", "*.tplate") ,("HTML files", "*.html;*.htm") ,("All files", "*.*") )) if filename: try: self.settings["template"].set(filename) except: messagebox.showerror("Open Source File", "Failed to read file /n''%s''"%filename) return

El método es un híbrido de algún código que encontré en el camino con mis propias personalizaciones. Parece que finalmente lo hice funcionar (un poco), aunque no es exactamente como lo necesito.

Recibo este error cuando activo el botón ''Examinar'': NameError: global name ''filedialog'' is not defined .

He encontrado problemas bastante similares en el camino, pero todas las soluciones sugeridas que he cubierto. Entré en la sección de ayuda de ''archivo de diálogo'' de IDLE pero tampoco obtuve nada de allí.

¿Alguien le importaría proporcionar un desglose y un poco de orientación sobre esto? ninguno de mis libros lo aborda específicamente, y he comprobado todas las soluciones proporcionadas a otros: estoy perdido.


¿Intentó agregar el prefijo automático al fileName y reemplazar el método arriba del botón? Con uno mismo, se vuelve visible entre los métodos.

... def load_file(self): self.fileName = filedialog.askopenfilename(filetypes = (("Template files", "*.tplate") ,("HTML files", "*.html;*.htm") ,("All files", "*.*") )) ...


La excepción que recibe es decirle que filedialog no está en su espacio de nombres. filedialog (y btw messagebox ) es un módulo tkinter, por lo que no se importa solo from tkinter import *

>>> from tkinter import * >>> filedialog Traceback (most recent call last): File "<interactive input>", line 1, in <module> NameError: name ''filedialog'' is not defined >>>

deberías usar, por ejemplo:

>>> from tkinter import filedialog >>> filedialog <module ''tkinter.filedialog'' from ''C:/Python32/lib/tkinter/filedialog.py''> >>>

o

>>> import tkinter.filedialog as fdialog

o

>>> from tkinter.filedialog import askopenfilename

Así que esto haría con su botón de navegación:

from tkinter import * from tkinter.filedialog import askopenfilename from tkinter.messagebox import showerror class MyFrame(Frame): def __init__(self): Frame.__init__(self) self.master.title("Example") self.master.rowconfigure(5, weight=1) self.master.columnconfigure(5, weight=1) self.grid(sticky=W+E+N+S) self.button = Button(self, text="Browse", command=self.load_file, width=10) self.button.grid(row=1, column=0, sticky=W) def load_file(self): fname = askopenfilename(filetypes=(("Template files", "*.tplate"), ("HTML files", "*.html;*.htm"), ("All files", "*.*") )) if fname: try: print("""here it comes: self.settings["template"].set(fname)""") except: # <- naked except is a bad idea showerror("Open Source File", "Failed to read file/n''%s''" % fname) return if __name__ == "__main__": MyFrame().mainloop()


Primero tuve que especificar comandos individuales y luego usar * para poner todo en orden.

from tkinter import filedialog from tkinter import *