2012-02-11 41 views
30

Tôi đang làm việc lần đầu tiên trên mã hóa nút Duyệt cho một chương trình bằng Python3. Tôi đã tìm kiếm trên internet và trang web này, và thậm chí cả thư viện chuẩn python.filedialog, tkinter và mở các tệp

Tôi đã tìm thấy mã mẫu và giải thích rất hời hợt về mọi thứ, nhưng tôi không thể tìm thấy bất kỳ điều gì giải quyết được vấn đề tôi đang gặp trực tiếp hoặc giải thích đủ để tôi có thể tùy chỉnh mã theo nhu cầu của mình.

Dưới đây là đoạn mã liên quan:

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 

Phương pháp này là một lai của một số mã tôi tìm thấy dọc theo chiều với các tùy chỉnh của riêng tôi. Có vẻ như cuối cùng tôi đã làm việc đó (kinda), mặc dù nó không chính xác như thế nào tôi cần nó.

Tôi gặp lỗi này khi tôi kích hoạt nút 'Duyệt qua': NameError: global name 'filedialog' is not defined.

Tôi đã tìm thấy các vấn đề khá giống nhau trên đường đi nhưng tất cả các giải pháp đề xuất tôi đã đề cập đến. Tôi đã đi vào phần 'helpialog' giúp đỡ của IDLE nhưng không thu hút bất cứ điều gì từ đó hoặc.

Một người nào đó có thể chia nhỏ và hướng dẫn một chút về vấn đề này; không có cuốn sách nào của tôi đề cập cụ thể đến nó và tôi đã kiểm tra tất cả các giải pháp được cung cấp cho người khác — tôi đã mất.

+3

Bạn đã nhập không? 'từ tkinter import filedialog' –

Trả lời

50

Ngoại lệ bạn nhận được cho bạn biết filedialog không có trong không gian tên của bạn. filedialog (và btw messagebox) là một mô-đun Tkinter, vì vậy nó không được nhập khẩu chỉ với 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 
>>> 

bạn nên sử dụng ví dụ:

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

hoặc

>>> import tkinter.filedialog as fdialog 

hoặc

>>> from tkinter.filedialog import askopenfilename 

Vì vậy, điều này sẽ làm cho nút duyệt của bạn:

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

Cảm ơn bạn. Bạn biết đấy, tôi đã rối tung xung quanh với việc nhập khẩu cả hai từ tkinter (chỉ không hiểu chính xác), và bởi vì tôi đã không nhận được nó chính xác ngay tôi đã được công nhận sai lầm của tôi đến một nơi nào đó tôi đã không làm cho một sai lầm. Câu hỏi của tôi là: Tôi nghĩ rằng 'từ nhập khẩu tkinter *' nhập ALL của tkinter. vậy tại sao những thứ này phải được nhập riêng biệt? Bạn có thể chỉ cho tôi một số tài liệu về điều này không? Cảm ơn một lần nữa – Icsilk

+0

Tôi didnt tìm thấy bất kỳ liên kết với đơn giản, để giải thích điểm. Có thể bạn có nhiều may mắn hơn. Kiểm tra python đầu tiên [reference] (http: // docs.python.org/reference/simple_stmts.html#the-import-statement) và [docs] (http://docs.python.org/tutorial/modules.html#packages) – joaquin

+0

Câu mở đầu của giải pháp này cho bạn biết lý do bạn cần hai câu. filedialog là một mô-đun, do đó, nó không được nhập khẩu với "từ nhập khẩu tkinter *", và phải được nhập riêng. – RufusVS

3

Bạn đã thử thêm tiền tố tự vào tên tệp và thay thế phương thức trên Nút chưa? Với bản thân, nó trở nên có thể nhìn thấy giữa các phương pháp.

... 

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

tôi phải chỉ định lệnh cá nhân đầu tiên và sau đó sử dụng * để mang lại tất cả trong lệnh.

from tkinter import filedialog 
from tkinter import * 
+0

"từ đơn vị nhập khẩu tkinter"
"từ nhập khẩu tkinter *" – James

Các vấn đề liên quan