2012-02-11 3 views
30

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

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

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

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 

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

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

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

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

+3

Вы импортировали его? 'from tkinter import filedialog' –

ответ

50

Исключение вы получаете говорит вам 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

Спасибо. Вы знаете, я возился с импортом их как из tkinter (просто не понял его точно), а потому, что я не понимал, что это правильно, я аккредитовал свою ошибку где-то, где я не ошибся. Мой вопрос: я думал, что «из tkinter import *» импортировал ВСЕ tkinter. так зачем их нужно импортировать отдельно? Можете ли вы указать мне на некоторые документы об этом? Еще раз спасибо – Icsilk

+0

Я не нашел никакой ссылки с простым, точным объяснением. Может быть, тебе повезло больше. Проверьте первый python [reference] (http: // docs.python.org/reference/simple_stmts.html#the-import-statement) и [docs] (http://docs.python.org/tutorial/modules.html#packages) – joaquin

+0

В первом предложении этого решения сообщается, почему вы нужны два утверждения. filedialog - это модуль, поэтому он не импортируется с помощью «from tkinter import *» и должен быть импортирован отдельно. – RufusVS

3

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

... 

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

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

from tkinter import filedialog 
from tkinter import * 
+0

"от tkinter import filedialog"
"от tkinter import *" – James

Смежные вопросы