2012-06-12 83 views
8

我有下面的代码,我试图让用户打开一个文本文件,并且一旦用户选择了它,我希望代码读取它(这不是一个完整的代码块,只是为了展示我的后面)。用askopenfilename打开和读取文件

但是,我使用tkFileDialog.askopenfilename并添加'mode ='rb''或使用下面的代码和使用读取它会产生一个错误的困难。

有谁知道我可以如何安排这样做,因为我不希望为每个项目(如Menu和Listbox)输入Tkinter.'module'。初学者到Tkinter,有点困惑!谢谢您的帮助!

import sys 
from Tkinter import * 
import tkFileDialog 
from tkFileDialog import askopenfilename # Open dialog box 

fen1 = Tk()        # Create window 
fen1.title("Optimisation")    # 

menu1 = Menu(fen1) 

def open(): 

    filename = askopenfilename(filetypes=[("Text files","*.txt")]) 
    txt = filename.read() 
    print txt 
    filename.close() 

fen1.mainloop() 

很显然,我到达这里的错误是:

AttributeError: 'unicode' object has no attribute 'read' 

我不明白如何使用askopen,也能读我打开该文件。

+0

你不妨先从一个简单的问题:你可以写,打开并打印特定文件Python程序,说'在/ etc/passwd'或其他一些简单的,已知对存在,文件? – sarnold

+0

我以前曾使用过读写文本文件,但从未使用过Tkinter,打开文件后它有点困惑。我需要剥去文件名吗? – user2063

回答

6

askopenfilename只返回一个文件名,你想要的是askopenfile它接受mode参数并为你打开文件。

+0

这样简单的答案工作,谢谢! – user2063

7

您示例代码中的filename就是这样一个字符串,表示您希望打开的文件的名称。您需要将其传递给open()方法以返回名称的文件句柄。然后您可以从文件句柄中读取。

下面是一些快速和脏的代码,直接在Python解释器中运行。 (您可以在脚本快速尝试的事情了运行它,太,但我真的很喜欢REPL接口。你可能会喜欢它。)

$ python 
Python 2.7.3 (default, Apr 20 2012, 22:39:59) 
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import Tkinter 
>>> from tkFileDialog import askopenfilename 
>>> root = Tkinter.Tk() ; root.withdraw() 
'' 
>>> filename = askopenfilename(parent=root) 
>>> filename 
'/tmp/null.c' 
>>> f=open(filename) 
>>> f.read() 
'#include<stdio.h>\n\nint main()\n{\n for(;NULL;)\n printf("STACK");\n\n return 0;\n}\n\n' 
>>> f.close() 
>>> 

需特别注意的,有什么Tkinter的专用阅读该文件 - 该对话框只是给你一个文件名。

+0

是否可以通过'askopenfilename'或其他命令来浏览远程机器的文件 – Fahadkalis

0

你的错误是你的函数的名字。我只是更改def open()def open1(),它的工作原理。

def open1(): 

    filename = askopenfilename(parent=fen1) 
    print(filename) 
    f = open(filename) 
    txt = f.read() 
    print txt 
    f.close() 
+0

“open”不是由原始问题中的open函数调用的。在你的例子中,似乎你会定义一个递归函数,但你的函数来自哪里? – RufusVS