2016-07-21 9 views
-1

Ich kann keine Zeichenfolge in meine tkinter Listbox 'einfügen'. Mein Code ist:python tkinter listbox - Fehler einfügen

from Tkinter import * 
from tkFileDialog import askopenfilenames 

def ImportFiles(): 
    Tk().withdraw() 
    filenames = askopenfilenames() 
    for f in filenames: 
     listbox1.insert(END, f) 
    return 

root = Tk() 
root.geometry("500x800") 

listbox1 = Listbox(root).grid(row=1, sticky=W, padx=20, pady=20) 
button1 = Button(root, text='Import', command=ImportFiles).grid(row=2, sticky=W, padx=20) 

root.mainloop() 

Wenn ich dieses Codeschnipsel laufe, erscheint die GUI gut. Ich drücke den Knopf und und öffnet Dateidialog, wie erwartet. Dann, wenn ich einige Dateien auswähle und "OK" drücke, bombardiert der Code. Ich erhalte den folgenden Fehler:

Datei "C: \ Python27 \ lib \ lib-tk \ Tkinter.py", Zeile 1536 in Anruf

Rückkehr self.func (* args)

File ".../pyGUI_01.py", Zeile 10, in ImportFiles

listbox1.insert (END, f)

Attribute: 'NoneType' Objekt hat kein Attribut 'einfügen'

Ich verstehe es nicht. Ich habe das Objekt 'listbox1' in die TK Listbox gesetzt. In meiner IDE gibt es keinen Hinweis darauf, dass der Befehl 'Einfügen' nicht gültig ist (PyCharm). Was mache ich falsch?

+0

Zunächst einmal gibt es viele Fragen, die Ihr Problem lösen würden, wenn Sie sie erforscht hätten. Zeigen Sie uns, was Sie getan haben, um das Problem selbst zu lösen. Bitte lesen Sie den Abschnitt [Fragen] (https://stackoverflow.com/help/how-to-ask) sorgfältig durch. –

+0

Zweitens, 'filenames = askopenfilenames()': diese einzelne Codezeile erhält keinen Wert von einer Datei, die Sie auswählen. –

+0

@Parviz. filenames = askopenfilenames() ERHÄLT die Dateinamen. Ich habe die Anweisung 'print' verwendet, um sie zu sehen. Es erzeugt ein Tupel von Strings. Haben Sie versucht, dies vor sich selbst zu verwenden? – twegner

Antwort

1

Sie setzen Ihre Variable "listbox1" auf das Gitterergebnis (row = 1, sticky = W, padx = 20, pady = 20).

Versuchen zwei Zeilen: "grid()"

listbox1 = Listbox(root) 
listbox1.grid(row=1, sticky=W, padx=20, pady=20) 

Nun ist ListBox1 tatsächlich auf eine Instanz Listbox gesetzt, und nicht das Ergebnis von

+0

Das hat es getan. Funktioniert perfekt. Ich wusste nicht, dass ich "Gitter" nicht auf derselben Linie verwenden könnte. – twegner

-1

Fhaab ist richtig, aber warum erstellen Sie eine neue Tk-Instanz und zerstören sie dann mit Tk(). Remove()?

+0

das beantwortet die Frage nicht. –

+0

Ich versuche, über Tkinter zu lernen, also mache ich eine Menge Dinge, um zu sehen, was passiert. – twegner