我想将变量(包括其值)保存到文本文件中,以便下次打开程序时,任何更改都会自动保存到文本文件中 .例如:
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()
最佳答案
您必须在编译时知道变量的名称。所以你需要做的就是:
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()
之前发生的情况是,保存到文件过程是在用户插入任何数据之前立即发生的。通过向按钮单击注册一个函数,您可以确保只有当按下按钮时,该函数才会执行。
我强烈建议您在调试环境中使用旧代码,或者使用一些打印来弄清楚代码是如何工作的。
关于python - 将变量保存在文本文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30139243/