如何访问存储在变量名下的文本文件

时间:2017-04-16 14:09:38

标签: python python-3.x tkinter python-3.3

当尝试从Python访问外部文本文件时,我在尝试简单地查看文件内容和尝试添加到文件时遇到了一些问题。涉及的程序部分采用用户名并在此用户名下创建文本文件(如果该用户名尚不存在)。使用Create()函数时,遇到以下TypeError

Exception in Tkinter callback
Traceback (most recent call last):
  File "D:\Python 3.3.2\A Level Computer Science\stackoverflowsolution.py", line 48, in View
    with open(userfile, 'r') as u:
FileNotFoundError: [Errno 2] No such file or directory: 'name.txt'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:\Python 3.3.2\Python files\lib\tkinter\__init__.py", line 1475, in __call__
    return self.func(*args)
  File "D:\Python 3.3.2\A Level Computer Science\stackoverflowsolution.py", line 91, in Add
    u.write(addText.get())
TypeError: get() missing 1 required positional argument: 'index1'

这是遇到错误的代码:

from tkinter import *
import os

def Login():

    global nameEL
    global rootA

    rootA = Tk()
    rootA.title('Login')

    intruction = Label(rootA, text='Please Login\n')
    intruction.grid(sticky=E)

    nameL = Label(rootA, text='Username: ')
    nameL.grid(row=1, sticky=W)

    nameEL = Entry(rootA)
    nameEL.grid(row=1, column=1)

    loginB = Button(rootA, text='Login', command=LoggedIn)
    loginB.grid(columnspan=2, sticky=W)
    rootA.mainloop()

def LoggedIn():

    global userfile

    roots1 = Tk()
    roots1.title('Logged in successfully')
    roots1.geometry('300x300')

    userfile = nameEL.get() + '.txt'

    View1 = Button(roots1, text='View', command=View)
    View1.grid(columnspan=10, sticky=W)
    View1.pack(fill = 'x')

    Create1 = Button(roots1, text='Create', command=Create)
    Create1.grid(columnspan=10, sticky=W)
    Create1.pack(fill = 'x')

def View():

    global userfile

    try:
        with open(userfile, 'r') as u:
            print(u.read())
    except FileNotFoundError:
        r = Tk()
        r.title('View')
        r.geometry('300x50')
        rlbl = Label(r, text='\n[!] Theres nothing to see here [!]')
        rlbl.pack()
        r.mainloop()
        LoggedIn()
    except ValueError:
        r = Tk()
        r.title('View')
        r.geometry('300x50')
        rlbl.pack()
        r.mainloop()
        LoggedIn()

def Create():

    global addText
    global rootC

    rootC = Tk()
    rootC.title('Lets add some information')
    instruction = Label(rootC, text='Please enter the information you would like to add\n')
    instruction.grid(row=0, column=0, sticky=W)

    newText = Label(rootC, text='info: ')
    newText.grid(row=1, column=0)

    addText = Text(rootC)
    addText.grid(row=2, column=0)

    addButton = Button(rootC, text='Add', command=Add)
    addButton.grid(columnspan=2, sticky=W)
    addButton.grid(row=3, column=0)

def Add():

    global userfile

    with open(userfile, 'a') as u:
        u.write(addText.get())
        u.write('\n')

        rootC.destroy()
        LoggedIn()

Login()

1 个答案:

答案 0 :(得分:2)

我会这样做:

def LoggedIn():

    global userfile

    roots1 = Tk()
    roots1.title('Logged in successfully')
    roots1.geometry('300x300')

    userfile = nameEL.get() + '.txt'
    #and the tkinter widgets

此代码userfile = open(nameEL.get() + '.txt', 'a')有点奇怪,您使用open命令创建一个您使用的对象,就像稍后它是一个字符串一样。您只需要userfile作为字符串,而不是命令。然后,您可以使用它来打开文件(见下文)

def View():

    global userfile

    try:
        with open (userfile, 'r') as u:
            print (u.read())
    except FileNotFoundError: #file doesn't exist
        r = Tk()
        r.title('View')
        r.geometry('300x50')
        rlbl = Label(r, text='\n[!] This file doesn't exist [!]')
        rlbl.pack()
        r.mainloop()
        LoggedIn()
    except ValueError: #some error when reading
        r = Tk()
        r.title('View')
        r.geometry('300x50')
        rlbl = Label(r, text='\n[!] Problem when reading the file [!]')
        rlbl.pack()
        r.mainloop()
        LoggedIn()

此处print(userfile.read())无效,因为您使用userfile模式创建了append(也许还有其他问题)

最后

def Add():
    global userfile

    with open(userfile, 'a') as u:
        u.write(addText.get()) #don't forger the .get ()
        u.write('\n')

    rootC.destroy()
    LoggedIn()

在这里,你试图在文件中写一个Entry对象,Python并不是那样的。您只需添加.get()即可写入Entry对象addText中的内容。 这里还有一个错误:当使用with ()命令时,您不需要关闭该文件,它会自动完成。 可能仍有问题,但文件应该可以正常工作。

编辑: 使用Text窗口小部件时,get()命令需要的参数多于仅Entry窗口小部件的参数 你可以用这个:

u.write (addText.get('1.0', END))