将变量保存在文本文件中

hon*_*ger 5 python user-interface tkinter python-3.x

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

    balance = total_savings - total_expenses 
Run Code Online (Sandbox Code Playgroud)

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

    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()
Run Code Online (Sandbox Code Playgroud)

修改后的代码:

    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)
Run Code Online (Sandbox Code Playgroud)

登录代码:

    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()
Run Code Online (Sandbox Code Playgroud)

Reu*_*ani 5

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

with open('some_file.txt', 'w') as f:
    f.write("balance %d" % balance)
Run Code Online (Sandbox Code Playgroud)

这可以更方便地使用dict对象将名称映射到值进行管理。

您可能还想了解picklejson模块,这些模块提供了对象的简单序列化,例如dict.

使用序列化程序的方法pickle是:

import pickle as serializer

balance = total_savings - total_expenses 
with open('some_file.txt', 'w') as f:
    serializer.dump( balance, f)
Run Code Online (Sandbox Code Playgroud)

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

编辑:

在您的示例中,您尝试从tkinterEntry小部件存储文本。在这里阅读。

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

StringVar为变量创建:

username = StringVar()
password = StringVar()
Run Code Online (Sandbox Code Playgroud)

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

e1 = Entry (register, textvariable=username)
e2 = Entry (register, textvariable=password, show= "*")
Run Code Online (Sandbox Code Playgroud)

使用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)
Run Code Online (Sandbox Code Playgroud)

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

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

编辑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()
Run Code Online (Sandbox Code Playgroud)

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

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