2017-04-16 55 views
0

當試圖訪問從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() 
+2

爲什麼你相信你可以從文件中讀取以追加方式打開? –

+0

'NameError:name'Login'is not defined'from the last line is not a good start。然後,從'userfile = open(nameEL.get()+'.txt','a')'行'nameEr':'nameEL'未被定義。您的示例代碼不可執行。 – martineau

回答

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())是行不通的,因爲你append模式下創建userfile(也許還有其他的問題太)

終於

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)) 
+0

文件創建似乎很好地工作,但將數據添加到一個新的文本文件時,我得到一個錯誤:FileNotFoundError:[錯誤2]沒有這樣的文件或目錄:「name.txt」 我也得到了錯誤:類型錯誤:得到( )失蹤1個人需要的位置參數:「索引1」 第一個錯誤是來自View功能和第二誤差來源於添加的功能在該行:u.write(addText.get()) 我遇到的迴歸self.func (*參數)試圖用一個獲得()作爲文件名,但我不知道如何解決這個 – alee23

+0

你能有什麼我給你重寫你的代碼,並用新的代碼編輯你的答案時,前」錯誤和錯誤? – Guil23

+0

我認爲這就是所有的改變! – alee23