14

我有以下代码,我试图允许用户打开一个文本文件,一旦用户选择了它,我希望代码读取它(这不是一个完成的代码块,只是为了显示什么我追求)。

但是,我在使用 tkFileDialog.askopenfilename 并添加 'mode='rb'' 或使用如下代码并在产生错误时使用 read 时遇到了困难。

有谁知道我如何安排这样做,因为我不希望为每个项目(例如菜单和列表框)键入 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 也无法读取我正在打开的文件。

4

3 回答 3

9

您的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 的内容——对话框只是为您提供文件名。

于 2012-06-12T08:55:31.683 回答
9

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

于 2012-06-12T08:57:13.700 回答
0

您的错误是您的函数的名称。我只是改变def open()def open1()它,它的工作原理。

def open1():

    filename = askopenfilename(parent=fen1)
    print(filename)
    f = open(filename)
    txt = f.read()
    print txt
    f.close()
于 2016-06-07T08:56:23.310 回答