web-dev-qa-db-fra.com

filedialog, tkinter et ouverture de fichiers

Je travaille pour la première fois à coder un bouton Parcourir pour un programme en Python3. J'ai fait des recherches sur Internet et sur ce site, et même python bibliothèque standard.

J'ai trouvé un exemple de code et des explications très superficielles, mais je n'ai rien trouvé qui réponde directement au problème que j'ai ou une explication suffisante pour pouvoir personnaliser le code en fonction de mes besoins.

Voici l'extrait pertinent:

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

La méthode est un hybride de code que j'ai trouvé en cours de route avec mes propres personnalisations. Il semble que je l’ai enfin obtenu (un peu), bien que ce ne soit pas exactement ce dont j’avais besoin.

J'obtiens cette erreur en activant le bouton 'Parcourir': NameError: global name 'filedialog' is not defined.

J'ai trouvé des problèmes assez similaires en cours de route, mais toutes les solutions suggérées ont été couvertes. Je suis allé dans la section d'aide 'filedialog' de IDLE mais je n'y ai rien appris non plus.

Est-ce que cela vous dérangerait de fournir une ventilation et quelques conseils à ce sujet? aucun de mes livres ne l'aborde de manière spécifique et j'ai vérifié toutes les solutions proposées aux autres - je suis perdu.

36
Icsilk

L'exception que vous obtenez est de vous dire que filedialog n'est pas dans votre espace de noms. filedialog (et btw messagebox) est un module tkinter, il n'est donc pas importé avec 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
>>> 

vous devriez utiliser par exemple:

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

ou

>>> import tkinter.filedialog as fdialog

ou

>>> from tkinter.filedialog import askopenfilename

Donc, cela ferait pour votre bouton de navigation:

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 __== "__main__":
    MyFrame().mainloop()

enter image description here

60
joaquin

Avez-vous essayé d’ajouter le préfixe personnel au nom de fichier et de remplacer la méthode située au-dessus du bouton? Avec le soi, cela devient visible entre les méthodes.

...

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

Je devais d'abord spécifier des commandes individuelles, puis utiliser le * apporter tout le commandement.

from tkinter import filedialog
from tkinter import *
1
James