簡體   English   中英

在 Python 中創建密碼管理器但它不寫入文件

[英]Creating A Password Manger In Python But It Is Not Writing To File

我正在嘗試使用 tkinter 在 python 中創建一個密碼管理器。 但是當我嘗試寫入帳戶名、用戶名和密碼時,它不起作用。 我正在使用帶有 StringVar 的文本框從文本框中獲取信息。 我不知道錯誤是在文本框中還是在寫入文件中。 我有以下代碼:

from tkinter import *
from tkinter import messagebox

loginwin = Tk()
loginwin.wm_title("Login")
loginwin.geometry("225x75")

win = Tk()
win.wm_title("Password Manger")
win.geometry("550x215")
win.withdraw()

u = StringVar()
p = StringVar()

a = StringVar()
u1 = StringVar()
p1 = StringVar()

def login():
    username1 = u.get()
    password1 = p.get()
    if username1 == "":
        if password1 == "":
            messagebox.showinfo("Login", "Login Complete")
            loginwin.withdraw()
            win.deiconify()
        else:
            messagebox.showinfo("Login", "Incorrect Password or Username")
    else:
        messagebox.showinfo("Login", "Incorrect Password or Username")

def add():
        account1 = a.get()
        username2 = u1.get()
        password2 = p1.get()
        account1 = str(account1)
        username2 = str(username2)
        password2 = str(password2)
        with open("passwords.txt", "w") as file:
                file.write("\n" + account1 + " " + username2 + " " + password2)

Label(loginwin, text="   Username:  ").grid(row=1, column=1)
Label(loginwin, text="   Password:  ").grid(row=2, column=1)
Label(loginwin, text="Hint: Nothing").grid(row=3, column=2)

Label(win, text="   Account:  ").grid(row=1, column=1)
Label(win, text="   Username: ").grid(row=2, column=1)
Label(win, text="   Password: ").grid(row=3, column=1)

username = Entry(loginwin, textvariable = u)
username.grid(row=1, column=2)
password = Entry(loginwin, textvariable = p, show = "*")
password.grid(row=2, column=2)

account = Entry(win, textvariable = a)
account.grid(row=1, column=2)
username1 = Entry(win, textvariable = u1)
username1.grid(row=2, column=2)
password1 = Entry(win, textvariable = p1)
password1.grid(row=3, column=2)

login = Button(loginwin, text="Login", command=login)
login.grid(row=3, column=1)

add = Button(win, text="Add", command=add)
add.grid(row=4, column=1)

loginwin.mainloop()
win.mainloop()

您的問題是您必須分離Tk根對象。

簡短的版本是解決此問題的最簡單且幾乎肯定是最好的方法是不這樣做。 改變這一行:

win = Tk()

……對此:

win = Toplevel(loginwin)

並擺脫這一行:

win.mainloop()

你可能也有一個第二個問題:在打開文件w模式,而不是a模式,你擦除無論在那里,但我懷疑這是你想要的。 所以,這樣做:

with open("passwords.txt", "a") as file:

如果你想了解什么是錯的:簡短的說法是你永遠不應該在同一個程序中擁有兩個Tk根對象,除非你真的知道你在做什么並且有很好的理由。 長版本有點復雜,但我會嘗試。


第一個問題是每個根都有自己獨立的 Tcl 環境,這意味着它有自己獨立的全局變量來保存那些StringVar的內容,依此類推。

當你這樣做時:

u = StringVar()

...在默認根目錄中創建一個名為Py_VAR0的 Tcl 變量,您創建的第一個, loginwin ,並將 Python 變量u附加到該 Tcl 變量。

當你這樣做時:

account = Entry(win, textvariable = a)

… 告訴 Entry 將其文本存儲在其根目錄中名為Py_VAR0中。 但它的根是win ,而不是loginwin 因此,每次文本更改時, win root 中的Py_VAR0的內容Py_VAR0更改,但loginwin root 中的Py_VAR0的內容不會。

當你這樣做時:

account1 = a.get()

… 因為aloginwinPy_VAR0 ,而不是winPy_VAR0 ,所以你沒有得到改變的值,你得到的是StringVar的默認值,它是一個空字符串。

其他變量也是如此。

所以,當你這樣做時:

    with open("passwords.txt", "w") as file:
            file.write("\n" + account1 + " " + username2 + " " + password2)

……你打開passwords.txt並刪除它(這就是w模式的意思),然后寫下這個:

"\n" + "" + " " + "" + " " + ""

...實際上並不是什么都沒有,但在您的文本編輯器中它可能看起來像什么都沒有,因為它只是一個兩行文件,第一行沒有任何內容,第二行有兩個空格。

您可以通過顯式地為每個StringVar右根作為父項來解決此問題,就像任何其他 Tkinter 對象一樣:

u = StringVar(win)

第二個問題是每個根都需要自己的mainloop

一個接一個地運行意味着第二個在第一個退出之前不會運行。 這意味着在loginwin退出之前,任何附加到win上的任何小部件的代碼都不會運行。

這意味着您的Entry(win, textvariable = a)未處於活動狀態並接收事件,因此它甚至不會設置錯誤的字符串變量; 它根本不會做任何事情。

解決這個問題的唯一方法是手動將兩個循環交織在一起——讓一個驅動另一個。 這並不,但是它不完全微不足道的,無論是。


但是解決這兩個問題的更簡單的方法是沒有兩個根。

如果出於某種原因確實需要兩個單獨的根,那么您必須正確管理它們的變量和主循環。

但是,如果您這樣做是因為您想要另一個頂級窗口,請為此使用Toplevel

如果你這樣做是出於其他原因......好吧,這取決於你為什么這樣做,但有兩個根可能不是正確的答案。

您的代碼有幾個問題。

您正在使用<var>.get()來獲取條目中的文本,但是如果您嘗試打印其輸出,那么您將獲得條目名稱,而不是文本。 使用<entry>.get()獲取文本。


您正在使用open("<file>","w")而模式w用於重寫文件。 我建議您使用模式a ,它會在文件末尾自動附加數據。


寫入數據后您沒有關閉文件。


add是函數的名稱,但您正在制作一個按鈕命名add login類似。 給這些按鈕一個不同的名字。


您更新的代碼是:

from tkinter import *
from tkinter import messagebox

loginwin = Tk()
loginwin.wm_title("Login")
loginwin.geometry("225x75")

win = Tk()
win.wm_title("Password Manger")
win.geometry("550x215")
win.withdraw()

u = StringVar()
p = StringVar()

a = StringVar()
u1 = StringVar()
p1 = StringVar()

def login():
    username1 = u.get()
    password1 = p.get()
    print(username1,password1)
    if username1 == "":
        if password1 == "":
            messagebox.showinfo("Login", "Login Complete")
            loginwin.withdraw()
            win.deiconify()
        else:
            messagebox.showinfo("Login", "Incorrect Password or Username")
    else:
        messagebox.showinfo("Login", "Incorrect Password or Username")

def add():
        account11 = str(account.get())
        username22 = str(username1.get())
        password22 = str(password1.get())
        file = open("passwords.txt", "a")
        file.write("\n" + account11 + " " + username22 + " " + password22)
        file.close()

Label(loginwin, text="   Username:  ").grid(row=1, column=1)
Label(loginwin, text="   Password:  ").grid(row=2, column=1)
Label(loginwin, text="Hint: Nothing").grid(row=3, column=2)

Label(win, text="   Account:  ").grid(row=1, column=1)
Label(win, text="   Username: ").grid(row=2, column=1)
Label(win, text="   Password: ").grid(row=3, column=1)

username = Entry(loginwin, textvariable = u)
username.grid(row=1, column=2)
password = Entry(loginwin, textvariable = p, show = "*")
password.grid(row=2, column=2)

account = Entry(win, textvariable = a)
account.grid(row=1, column=2)
username1 = Entry(win, textvariable = u1)
username1.grid(row=2, column=2)
password1 = Entry(win, textvariable = p1)
password1.grid(row=3, column=2)

button_login = Button(loginwin, text="Login", command=login)
button_login.grid(row=3, column=1)

button_add = Button(win, text="Add", command=add)
button_add.grid(row=4, column=1)

loginwin.mainloop()
win.mainloop()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM