filedialog, tkinter и открытие файлов - PullRequest
36 голосов
/ 11 февраля 2012

Я впервые работаю над кодированием кнопки «Обзор» для программы на Python3. Я искал в Интернете и на этом сайте, и даже в стандартной библиотеке Python.

Я нашел пример кода и очень поверхностные объяснения вещей, но я не смог найти ничего, что решает проблему, с которой я столкнулся, или достаточно хорошего объяснения, чтобы я мог настроить код под свои нужды.

Вот соответствующий фрагмент:

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

Метод представляет собой гибрид некоторого кода, который я нашел по пути с моими собственными настройками. Кажется, я наконец-то заставил его работать (вроде), хотя это не совсем то, что мне нужно.

Я получаю эту ошибку, когда активирую кнопку «Обзор»: NameError: global name 'filedialog' is not defined.

Я обнаружил довольно похожие проблемы на этом пути, но все предложенные мной решения были рассмотрены. Я вошел в раздел справки 'filedialog' IDLE, но тоже ничего не нашел.

Будет ли кто-то возражать против того, чтобы дать паузу и небольшое руководство по этому вопросу; ни одна из моих книг не посвящена этому конкретно, и я проверил все решения, предоставленные другим, - я потерян.

Ответы [ 3 ]

59 голосов
/ 11 февраля 2012

Исключение, которое вы получаете, говорит вам, что filedialog не находится в вашем пространстве имен.filedialog (и кстати messagebox) - это модуль tkinter, поэтому он не импортируется только с 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
>>> 

, который вы должны использовать, например:

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

>>> import tkinter.filedialog as fdialog

или

>>> from tkinter.filedialog import askopenfilename

Таким образом, это будет сделано для кнопки просмотра:

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 голосов
/ 11 февраля 2012

Вы пытались добавить собственный префикс к fileName и заменить метод над кнопкой? С самим собой это становится видимым между методами.

...

def load_file(self):
    self.fileName = filedialog.askopenfilename(filetypes = (("Template files", "*.tplate")
                                                     ,("HTML files", "*.html;*.htm")
                                                     ,("All files", "*.*") ))
...
1 голос
/ 17 сентября 2015

Сначала мне нужно было указать отдельные команды, а затем использовать * для ввода всех команд.

from tkinter import filedialog
from tkinter import *
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...