it-swarm.com.de

Felddialog, tkinter und Öffnen von Dateien

Ich arbeite zum ersten Mal daran, eine Schaltfläche zum Durchsuchen für ein Programm in Python3 zu codieren. Ich habe das Internet und diese Site durchsucht und sogar die Standardbibliothek python.

Ich habe Beispielcode und sehr oberflächliche Erklärungen gefunden, aber ich konnte nichts finden, das das Problem, das ich habe, direkt anspricht, oder eine ausreichend gute Erklärung, um den Code an meine Bedürfnisse anzupassen.

Hier ist das relevante Snippet:

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

Die Methode ist eine Mischung aus Code, den ich auf meinem Weg mit meinen eigenen Anpassungen gefunden habe. Es scheint, als hätte ich es endlich zum Laufen gebracht (irgendwie), obwohl es nicht genau so ist, wie ich es brauche.

Ich erhalte diese Fehlermeldung, wenn ich die Schaltfläche "Durchsuchen" aktiviere: NameError: global name 'filedialog' is not defined.

Ich habe auf dem Weg ziemlich ähnliche Probleme gefunden, aber alle Lösungsvorschläge, die ich behandelt habe. Ich bin in den 'filedialog'-Hilfebereich von IDLE gegangen, habe dort aber auch nichts gefunden.

Würde es jemandem etwas ausmachen, eine Panne und eine kleine Anleitung dazu zu geben? Keines meiner Bücher befasst sich speziell damit, und ich habe alle Lösungen überprüft, die anderen zur Verfügung gestellt wurden - ich bin verloren.

36
Icsilk

Die Ausnahme, die Sie erhalten, besagt, dass sich filedialog nicht in Ihrem Namespace befindet. filedialog (und übrigens messagebox) ist ein tkinter-Modul, daher wird es nicht nur mit from tkinter import * importiert.

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

sie sollten zum Beispiel verwenden:

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

oder

>>> import tkinter.filedialog as fdialog

oder

>>> from tkinter.filedialog import askopenfilename

Das würde also für Ihre Schaltfläche "Durchsuchen" gelten:

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

Haben Sie versucht, dem Dateinamen das Präfix self hinzuzufügen und die Methode über dem Button zu ersetzen? Mit dem Selbst wird es zwischen den Methoden sichtbar.

...

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

Ich musste zuerst einzelne Befehle angeben und dann das * um alle in Befehl zu bringen.

from tkinter import filedialog
from tkinter import *
1
James