【问题标题】:Loading data from a file and using it in tkinter从文件加载数据并在 tkinter 中使用它
【发布时间】:2015-12-14 18:35:55
【问题描述】:
import pickle
from tkinter import *
import tkinter.messagebox 

Menu = Tk()

Menu.resizable(width=False, height = False)
Menu.state('zoomed')
Menu.title("Gold Farm")

Example = {"Test":"Initial"}

def database():
    with open ("accounts.pickle", "rb") as f:
        return pickle.load(f)

accounts = database()

usernameL = Label(text = "Username: ")
usernameL.place(y= 300, x = 550)
usernameB = Entry()
usernameB.place(y = 300,x = 620)

passwordL = Label(text = "Password: ")
passwordL.place(y= 330, x = 550)
passwordB = Entry(show = "*")
passwordB.place(y = 330,x = 620)

eUsername = usernameB.get()
ePassword = passwordB.get()

def confirm():
   for item in accounts:
        if eUsername in accounts and accounts[eUsername] == ePassword:
           print("Correct")
    else:
           print("False")


Login = Button(text="Login", command = confirm)
Login.place(y = 350, x = 620)

这是我完成以下内容的代码:

  • 在 tkinter 窗口中询问用户用户名和密码
  • 将他们输入的任何内容设置为电子用户名和电子密码
  • 检查他们是否获得了正确的密码
  • 请记住,“示例”字典是帐户文件中内容的示例

问题是当我输入正确的用户名和密码时,它仍然返回为假。 所以; 我想要一些关于我做错了什么或解决什么问题的帮助。

测试

def databaseNew():
with open("accounts.pickle", "wb") as f:
    Entry = Setup["me"] = "Tes"
    pickle.dump(Entry, f)

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    您的代码中没有任何输入,如果您调用confirm(),您将看到False,因为您正在迭代字典中的每个名称,for item in accounts 将其与空字符串进行比较。您也可以将您的功能简化为return accounts.get(eUsername) == ePassword 进行检查:

    def confirm():
        print(accounts.get(eUsername) == ePassword)
    

    您需要打包标签等。

    import pickle
    
    from tkinter import *
    
    
    master = Tk()
    
    usernameL = Label(master, text="Username: ")
    usernameL.pack()
    usernameB = Entry(master)
    usernameB.pack()
    passwordL = Label(master, text="Password: ")
    passwordL.pack()
    passwordB = Entry(master, show="*")
    passwordB.pack()
    
    
    master.resizable(width=False, height=False)
    master.state('normal')
    master.title("Gold Farm")
    
    def database():
        with open("accounts.pickle", "rb") as f:
            return pickle.load(f)
    
    
    accounts = database()
    
    def confirm():
        u, p = usernameB.get(), passwordB.get()
        if accounts.get(u) == p:
            print(True)
            # do whatever here
        else:
            print(False)
            #  login is bad
            m  = messagebox.askretrycancel("Invalid input")
            if not m:
                 master.quit()
    
    Login = Button(master, text="Login", command=confirm)
    Login.place(y=350, x=620)
    Login.pack()
    
    mainloop() 
    

    这是一个粗略的示例,说明如何将新用户添加到现有的 dict 和 pickle,您可以填写缺少的逻辑并使用您计划的任何内容整理显示并验证输入:

    import pickle
    
    from tkinter import *
    
    master = Tk()
    
    usernameL = Label(master, text="Username: ")
    usernameL.pack()
    usernameB = Entry(master)
    usernameB.pack()
    passwordL = Label(master, text="Password: ")
    passwordL.pack()
    passwordB = Entry(master, show="*")
    passwordB.pack()
    
    master.resizable(width=False, height=False)
    master.state('normal')
    master.title("Gold Farm")
    
    
    def database():
        with open("accounts.pickle", "rb") as f:
            return pickle.load(f)
    
    
    accounts = database()
    
    def new():
        u, p = usernameB.get(), passwordB.get()
        if u in accounts:
            m = messagebox.askretrycancel("Invalid","Username taken")
            if not m:
                master.quit()
        else:
            accounts[u] = p
            with open("accounts.pickle","wb") as f:
                pickle.dump(accounts, f)
            # do whatever
    
    
    def confirm():
        u, p = usernameB.get(), passwordB.get()
        if accounts.get(u) == p:
            print(True)
            # do whatever here
        else:
            print(False)
            # do whatever when login is bad
            m  = messagebox.askretrycancel("Invalid input")
            if not m:
                master.quit()
    
    
    
    
    Login = Button(master, text="Login", command=confirm)
    Login.place(y=350, x=620)
    Login.pack()
    new_user = Button(master, text="Create acc", command=new)
    new_user.pack()
    mainloop()
    

    【讨论】:

    • 我将如何使用我收到的 True 和 False 输出?例如,如果为 True 则运行函数,如果为 False 则打印?
    • 谢谢,现在已修复。同样偏离主题,在文件中添加到字典的泡菜方式是什么?假设我想在 Test 之外添加一个新帐户。
    • @Csarg,我改变了逻辑,你应该在确认功能中验证用户输入,一个消息框可能会通知用户详细信息不正确。您是在问如何向您的 dict 添加键吗?
    • 是的,我在问如何将不同的帐户 keys 添加到现有的带有 pickle 和我当前文件的字典中
    • 只需pickle.load,添加您的数据和pickle.dump
    猜你喜欢
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多