将字典保存到文件 Python Tkinter
Save dictionary to file Python Tkinter
初次张贴者/编码新手,使用 Python3、Tkinter 和 Pickle。
对于我正在进行的项目,我设计了一个随机膳食生成器,它使用用户输入的成分并确定可以烹制哪些膳食。除了能够保存和打开成分字典外,一切都正常。
基本上我想要的是让用户能够保存他们的成分并使用文件对话框打开该文件。
这是我为保存食谱列表而编写的示例代码:
def save_Recipe():
file_name = filedialog.asksaveasfilename(initialdir="""C:/Users/tanne/Desktop/Coding_Exes/Foodomizer_lists/Recipe_List""", title= "Save File", filetypes=(("Dat Files", "*.dat"),("All Files", "**")))
if file_name:
if file_name.endswith(".dat"):
pass
else:
file_name = f"{file_name}.dat"
# Grab all stuff from recipe list
lrl= len(recipe_list)
stuff = recipe_list[0:lrl]
# Open the file
output_file = open(file_name, "wb")
# Actually add the stuff to the file
pickle.dump(stuff, output_file)
def open_Recipe():
file_name = filedialog.askopenfilename(initialdir= """C:/Users/tanne/Desktop/Coding_Exes/Foodomizer_lists/Recipe_List""", title= "Open File", filetypes=(("Dat Files", "*.dat"), ("All Files", "**")))
if file_name:
# Delete currently open list
display_recipe.delete(0,END)
#Open the file
input_file = open(file_name, "rb")
#Load the data from the file
stuff = pickle.load(input_file)
#Output stuff to the screen
n = 0
for item in stuff:
if item not in recipe_list:
recipe_list.insert(n, item)
n += 1
display_recipe_update()
这些功能通过菜单按钮访问。但我不知道如何用我的成分字典做同样的事情。示例 = {ingredient_name : num_of_ingredient}, {面包:2, 奶酪: 1}.
def save_ingredients():
global ingredients
global stuff2
file_name = filedialog.asksaveasfilename(initialdir="""C:/Users/tanne/Desktop/Coding_Exes/Foodomizer_lists/Ingredients_Dic""", title= "Save File", filetypes=(("Dat Files", "*.dat"),("All Files", "**")))
if file_name:
if file_name.endswith(".dat"):
pass
else:
file_name = f"{file_name}.dat"
# Grab all stuff from ingredients
stuff2 = ingredients.get(0,END)
input_file = open(file_name, 'wb')
pickle.dump(stuff2, input_file, protocol=pickle.HIGHEST_PROTOCOL)
input_file.close()
def open_ingredients():
file_name = filedialog.askopenfilename(initialdir= """C:/Users/tanne/Desktop/Coding_Exes/Foodomizer_lists/Ingredients_Dic""", title= "Open File", filetypes=(("Dat Files", "*.dat"), ("All Files", "**")))
if file_name:
# Delete currently open list
input_file = open(file_name, 'rb')
output_file = pickle.load(input_file)
print(output_file)
input_file.close()
我想要的是保存的文件原样包含字典中的所有信息。这是我的测试成分字典的示例。
ingredients = {"Bun": 1, "Beef Patty": 1, "Lettuce": 1, "Cheese": 1, "Tomatoe": 1, "Pizza Crust": 1, "Tomatoe Sauce": 1, "Pork" : 2, "Basil": 1, "Rice": 1, "Bread": 2}
程序在多个函数中使用此字典来确定哪些食谱(个人制作的 class 对象)可用。它通过遍历成分字典,找到与存储在食谱中的成分相匹配的键,并看到键的值 >= 配方中所需的成分数。
保存和打开字典时发生的事情是我可以保存文件和打开文件而不会出现任何错误。但是当我打印成分字典时它仍然是空的。
我的问题是如何将字典保存到文件中,然后当我打开该文件时字典将填充我保存在文件中的任何内容?
两天来我一直在查看 Whosebug,尝试我能看到的所有内容,但 none 它正在运行。任何建议将不胜感激!
保存 dict
的最简单方法是使用 json
import json
ingredients = {"Bun": 1, "Beef Patty": 1, "Lettuce": 1, "Cheese": 1, "Tomatoe": 1, "Pizza Crust": 1, "Tomatoe Sauce": 1, "Pork" : 2, "Basil": 1, "Rice": 1, "Bread": 2}
filename = 'path/to/file.txt'
#save file
with open(filename, 'w') as f:
f.write(json.dumps(ingredients))
#load file
with open(filename, 'r') as f:
ingredients_from_file = json.load(f)
json
还具有 human-readable 的优势,它可以帮助您诊断代码中的任何错误。
据我所知,您存储和读取数据的代码应该没问题。正如@Pepsi-Joe 所建议的,您可以使用 JSON 而不是 pickle 将数据保存到磁盘,因为它比 pickle 更安全、更便携。另一个建议是通常使用 with
语句打开文件以避免过时的文件句柄,例如:
with open("/path/to/file", 'r') as fh:
data = fh.readlines()
要调试此问题,我建议您打开交互式 Python 控制台,读取并存储文件。或者使用调试器查看写入的内容 (stuff2
) 并读取内容。也许这是您的 UI 代码中的错误?
如果您的 ingredients
与您描述的一样,我想 ingredients.get(0, END)
可以 return None
,然后将其保存到文件中。因此,该文件包含“无”,当您阅读它时会返回。把那行删掉,直接保存ingredients
就可以了。
初次张贴者/编码新手,使用 Python3、Tkinter 和 Pickle。
对于我正在进行的项目,我设计了一个随机膳食生成器,它使用用户输入的成分并确定可以烹制哪些膳食。除了能够保存和打开成分字典外,一切都正常。
基本上我想要的是让用户能够保存他们的成分并使用文件对话框打开该文件。
这是我为保存食谱列表而编写的示例代码:
def save_Recipe():
file_name = filedialog.asksaveasfilename(initialdir="""C:/Users/tanne/Desktop/Coding_Exes/Foodomizer_lists/Recipe_List""", title= "Save File", filetypes=(("Dat Files", "*.dat"),("All Files", "**")))
if file_name:
if file_name.endswith(".dat"):
pass
else:
file_name = f"{file_name}.dat"
# Grab all stuff from recipe list
lrl= len(recipe_list)
stuff = recipe_list[0:lrl]
# Open the file
output_file = open(file_name, "wb")
# Actually add the stuff to the file
pickle.dump(stuff, output_file)
def open_Recipe():
file_name = filedialog.askopenfilename(initialdir= """C:/Users/tanne/Desktop/Coding_Exes/Foodomizer_lists/Recipe_List""", title= "Open File", filetypes=(("Dat Files", "*.dat"), ("All Files", "**")))
if file_name:
# Delete currently open list
display_recipe.delete(0,END)
#Open the file
input_file = open(file_name, "rb")
#Load the data from the file
stuff = pickle.load(input_file)
#Output stuff to the screen
n = 0
for item in stuff:
if item not in recipe_list:
recipe_list.insert(n, item)
n += 1
display_recipe_update()
这些功能通过菜单按钮访问。但我不知道如何用我的成分字典做同样的事情。示例 = {ingredient_name : num_of_ingredient}, {面包:2, 奶酪: 1}.
def save_ingredients():
global ingredients
global stuff2
file_name = filedialog.asksaveasfilename(initialdir="""C:/Users/tanne/Desktop/Coding_Exes/Foodomizer_lists/Ingredients_Dic""", title= "Save File", filetypes=(("Dat Files", "*.dat"),("All Files", "**")))
if file_name:
if file_name.endswith(".dat"):
pass
else:
file_name = f"{file_name}.dat"
# Grab all stuff from ingredients
stuff2 = ingredients.get(0,END)
input_file = open(file_name, 'wb')
pickle.dump(stuff2, input_file, protocol=pickle.HIGHEST_PROTOCOL)
input_file.close()
def open_ingredients():
file_name = filedialog.askopenfilename(initialdir= """C:/Users/tanne/Desktop/Coding_Exes/Foodomizer_lists/Ingredients_Dic""", title= "Open File", filetypes=(("Dat Files", "*.dat"), ("All Files", "**")))
if file_name:
# Delete currently open list
input_file = open(file_name, 'rb')
output_file = pickle.load(input_file)
print(output_file)
input_file.close()
我想要的是保存的文件原样包含字典中的所有信息。这是我的测试成分字典的示例。
ingredients = {"Bun": 1, "Beef Patty": 1, "Lettuce": 1, "Cheese": 1, "Tomatoe": 1, "Pizza Crust": 1, "Tomatoe Sauce": 1, "Pork" : 2, "Basil": 1, "Rice": 1, "Bread": 2}
程序在多个函数中使用此字典来确定哪些食谱(个人制作的 class 对象)可用。它通过遍历成分字典,找到与存储在食谱中的成分相匹配的键,并看到键的值 >= 配方中所需的成分数。
保存和打开字典时发生的事情是我可以保存文件和打开文件而不会出现任何错误。但是当我打印成分字典时它仍然是空的。
我的问题是如何将字典保存到文件中,然后当我打开该文件时字典将填充我保存在文件中的任何内容?
两天来我一直在查看 Whosebug,尝试我能看到的所有内容,但 none 它正在运行。任何建议将不胜感激!
保存 dict
的最简单方法是使用 json
import json
ingredients = {"Bun": 1, "Beef Patty": 1, "Lettuce": 1, "Cheese": 1, "Tomatoe": 1, "Pizza Crust": 1, "Tomatoe Sauce": 1, "Pork" : 2, "Basil": 1, "Rice": 1, "Bread": 2}
filename = 'path/to/file.txt'
#save file
with open(filename, 'w') as f:
f.write(json.dumps(ingredients))
#load file
with open(filename, 'r') as f:
ingredients_from_file = json.load(f)
json
还具有 human-readable 的优势,它可以帮助您诊断代码中的任何错误。
据我所知,您存储和读取数据的代码应该没问题。正如@Pepsi-Joe 所建议的,您可以使用 JSON 而不是 pickle 将数据保存到磁盘,因为它比 pickle 更安全、更便携。另一个建议是通常使用 with
语句打开文件以避免过时的文件句柄,例如:
with open("/path/to/file", 'r') as fh:
data = fh.readlines()
要调试此问题,我建议您打开交互式 Python 控制台,读取并存储文件。或者使用调试器查看写入的内容 (stuff2
) 并读取内容。也许这是您的 UI 代码中的错误?
如果您的 ingredients
与您描述的一样,我想 ingredients.get(0, END)
可以 return None
,然后将其保存到文件中。因此,该文件包含“无”,当您阅读它时会返回。把那行删掉,直接保存ingredients
就可以了。