2012-02-11 24 views
30

Sto lavorando per la prima volta sulla codifica di un pulsante Sfoglia per un programma in Python3. Ho cercato su internet e su questo sito, e persino sulla libreria standard di Python.filedialog, tkinter e file di apertura

Ho trovato codice di esempio e spiegazioni molto superficiali delle cose, ma non sono stato in grado di trovare nulla che risolva il problema che sto avendo direttamente, o una spiegazione abbastanza buona in modo da poter personalizzare il codice in base alle mie esigenze.

Ecco il frammento di rilevante:

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 

Il metodo è un ibrido di un codice che ho trovato lungo la strada con i miei personalizzazioni. Sembra che finalmente l'ho fatto funzionare (un pò), anche se non è esattamente come ne ho bisogno.

Viene visualizzato questo errore quando si attiva il pulsante "Sfoglia": NameError: global name 'filedialog' is not defined.

Ho trovato problemi abbastanza simili lungo il percorso, ma tutte le soluzioni suggerite che ho trattato. Sono andato nella sezione di aiuto 'filedialog' di IDLE ma non ho raccolto nulla da li.

Qualcuno sarebbe disposto a fornire un'analisi e una piccola guida su questo; nessuno dei miei libri parla in modo specifico, e ho controllato tutte le soluzioni fornite agli altri: sono perso.

+3

Lo hai importato? 'da tkinter import filedialog' –

risposta

50

L'eccezione che si ottiene vi sta dicendo filedialog non è nello spazio dei nomi. filedialog (e btw messagebox) è un modulo Tkinter, in modo che non viene importato solo con 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 
>>> 

si dovrebbe usare per esempio:

>>> 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 

Quindi questo sarebbe fare per il vostro pulsante Sfoglia:

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() 

enter image description here

+2

Grazie. Sai, ho sbagliato a importarli entrambi da tkinter (semplicemente non ho capito bene), e dato che non stavo ottenendo esattamente ciò, stavo accreditando il mio errore in un posto dove non stavo facendo un errore. La mia domanda è: ho pensato che 'da tkinter import *' importato TUTTO di tkinter. quindi perché questi devono essere importati separatamente? Puoi indicarmi qualche documentazione su questo? Grazie ancora – Icsilk

+0

Non ho trovato alcun collegamento con la spiegazione semplice, al punto. Forse hai più fortuna. Controlla il primo python [riferimento] (http: // docs.python.org/reference/simple_stmts.html#the-import-statement) e [docs] (http://docs.python.org/tutorial/modules.html#packages) – joaquin

+0

La frase di apertura di questa soluzione ti dice perché bisogno delle due dichiarazioni filedialog è un modulo, quindi non viene importato con "from tkinter import *" e deve essere importato separatamente. – RufusVS

3

Hai provato ad aggiungere il prefisso di auto al fileName e sostituire il metodo sopra il pulsante? Con il sé, diventa visibile tra i metodi.

... 

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

ho dovuto specificare i singoli comandi prima e poi utilizzare il * di portare tutti al comando.

from tkinter import filedialog 
from tkinter import * 
+0

"da tkinter import filedialog"
"da tkinter import *" – James