【问题标题】:Saving a variable in a text file将变量保存在文本文件中
【发布时间】:2015-05-09 11:16:48
【问题描述】:

我想将变量(包括它的值)保存到一个文本文件中,以便下次打开我的程序时,任何更改都会自动保存到文本文件中 .例如:

    balance = total_savings - total_expenses 

我将如何将变量本身保存到文本文件中,而不仅仅是它的值? 此部分用于注册页面

    from tkinter import *
    register = Tk()
    Label(register, text ="Username").grid(row = 0)
    Label(register, text ="Password").grid(row = 1)

    e1 = Entry (register)
    e2 = Entry (register, show= "*")

    e1.grid(row = 0, column = 1)
    e2.grid(row = 1, column = 1)

    username = e1.get()
    password = e2.get()


    button1 = Button(register, text = "Register", command = register.quit)
    button1.grid(columnspan = 2)
    button1.bind("<Button-1>")

    import json as serializer
    with open('godhelpme.txt', 'w') as f:
        serializer.dump(username, f)
    with open('some_file.txt', 'w') as f:
        serializer.dump(password, f)


    register.mainloop()

修改后的代码:

    from tkinter import *
    register = Tk()
    Label(register, text ="Username").grid(row = 0)
    Label(register, text ="Password").grid(row = 1)

    username = StringVar()
    password = StringVar()

    e1 = Entry (register, textvariable=username)
    e2 = Entry (register, textvariable=password, show= "*")

    e1.grid(row = 0, column = 1)
    e2.grid(row = 1, column = 1)


    button1 = Button(register, text = "Register", command = register.quit)
    button1.grid(columnspan = 2)
    button1.bind("<Button-1>")

    import json as serializer
    with open('godhelpme.txt', 'w') as f:
        serializer.dump(username.get(), f)
    with open('some_file.txt', 'w') as f:
        serializer.dump(password.get(), f)

登录代码:

    from tkinter import *
    login = Tk()
    Label(login, text ="Username").grid(row = 0)
    Label(login, text ="Password").grid(row = 1)

    username = StringVar()
    password = StringVar()

    i1 = Entry(login, textvariable=username)
    i2 = Entry(login, textvariable=password, show = "*")

    i1.grid(row = 0, column = 1)
    i2.grid(row = 1, column = 1)

    def clickLogin():
            import json as serializer
            f = open('godhelpme.txt', 'r')
            file = open('some_file.txt', 'r')
            if username == serializer.load(f):
                    print ("hi")
            else:
                    print ("invalid username")
                    if password == serializer.load(file):
                            print ("HELLOOOO")
                    else:
                            print ("invalid password")



    button2 = Button(login, text = "Log In", command = clickLogin)
    button2.grid(columnspan = 2)


    login.mainloop()

【问题讨论】:

    标签: python user-interface python-3.x tkinter


    【解决方案1】:

    您必须在编译时知道变量的名称。所以你需要做的就是:

    with open('some_file.txt', 'w') as f:
        f.write("balance %d" % balance)
    

    使用dict 对象将名称映射到值会更方便管理。

    您可能还想了解pickle 或json 模块,它们提供了dict 等对象的简单序列化。

    pickle等序列化器的使用方式是:

    import pickle as serializer
    
    balance = total_savings - total_expenses 
    with open('some_file.txt', 'w') as f:
        serializer.dump( balance, f)
    

    您可以在提供的代码中将pickle 更改为json 以使用其他标准序列化程序并以json 格式存储对象。

    编辑:

    在您的示例中,您尝试存储来自tkinter 的Entry 小部件的文本。阅读它here。

    你可能错过的是使用 StringVariable 来捕获输入的文本:

    为变量创建StringVar:

    username = StringVar()
    password = StringVar()
    

    将 StringVar 变量注册到 Entry 小部件:

    e1 = Entry (register, textvariable=username)
    e2 = Entry (register, textvariable=password, show= "*")
    

    使用StringVar 将内容保存在两个单独的文件中:

    import json as serializer
    with open('godhelpme.txt', 'w') as f:
        serializer.dump(username.get(), f)
    with open('some_file.txt', 'w') as f:
        serializer.dump(password.get(), f)
    

    如果您希望它们在同一个文件中,请创建一个映射 (dict) 并将其存储:

    import json as serializer
    with open('godhelpme.txt', 'w') as f:
        serializer.dump(
            {
                "username": username.get(),
                "password": password.get()
            }, f
        )
    

    编辑 2:

    您在输入文本之前使用了序列化。将save 函数(可以稍后退出)注册到注册按钮。这样,在用户点击后会被调用(这意味着内容已经存在)。方法如下:

    from tkinter import *
    
    def save():
        import json as serializer
        with open('godhelpme.txt', 'w') as f:
            serializer.dump(username.get(), f)
        with open('some_file.txt', 'w') as f:
            serializer.dump(password.get(), f)
        register.quit()
    
    register = Tk()
    Label(register, text ="Username").grid(row = 0)
    Label(register, text ="Password").grid(row = 1)
    
    username = StringVar()
    password = StringVar()
    
    e1 = Entry (register, textvariable=username)
    e2 = Entry (register, textvariable=password, show= "*")
    
    e1.grid(row = 0, column = 1)
    e2.grid(row = 1, column = 1)
    
    # changed "command"
    button1 = Button(register, text = "Register", command = save)
    button1.grid(columnspan = 2)
    button1.bind("<Button-1>")
    register.mainloop()
    

    之前发生的事情是保存到文件过程在用户插入任何数据之前立即发生。通过为按钮单击注册一个函数,可以确保只有当按钮被按下时,该函数才会执行。

    我强烈建议您在调试环境中使用您的旧代码,或者使用一些打印来弄清楚代码是如何工作的。

    【讨论】:

    • 非常感谢 :) 如您所知,我完全是新手
    • 我们曾经都是编程新手。如果答案有效,您可以接受。
    • @honeybadger 你是怎么序列化你的数据的(字符串?字典?列表?)?我建议您打印数据或使用调试器。如果有问题在阅读本文后打开另一个问题:stackoverflow.com/help/mcve
    • 我使用了您发布给我的代码,但唯一的问题是引号..
    • 我会试试的。感谢您的帮助,我真的很感激
    【解决方案2】:

    将变量存储在.txt 文件中通常不是一个好习惯,Python 有一个非常好的库Pickle。但是,您仍然可以分析这两种方法并选择一种。

    方法一:

    使用.txt 文件:

    with open("variable_file.txt", "w") as variable_file:
        variable_file.write("a = 10")
    

    在检索您可以使用的值时:

    with open("variable_file.txt", "r") as variable_file:
        for line in variable_file.readlines():
            eval(line.strip())
    

    方法二:

    使用 Pickle 模块:

    import pickle
    
    a = 10
    
    pickle.dump( a, open( "save.p", "wb" ) )
    
    #Load the variable back from the pickle file.
    
    a = pickle.load( open( "save.p", "rb" ) )
    

    【讨论】:

    • 如果我将用户的用户名和密码保存为变量,这样的工作方式是否相同?
    猜你喜欢
    • 2012-02-27
    • 2020-06-30
    • 1970-01-01
    • 2015-03-23
    • 2014-04-24
    • 2016-10-25
    • 2018-06-15
    • 1970-01-01
    相关资源
    最近更新 更多