[英]How to EXACTLY save the state of a program in python?
我正在制作一個小型 gui 應用程序,它從轉換為 python 列表的文本文件中獲取單詞,顯示它,提供是/否按鈕,單擊時顯示下一個隨機單詞並從該列表中刪除先前顯示的單詞。 問題是我如何確保在單擊幾下后,如果我想關閉應用程序,它知道我在哪里停止並在下次我再次打開它時從那里開始,而不是回到原來的 state 沒有文字的地方從列表中刪除。 換句話說,我究竟如何保存我正在運行的程序的當前 state 以便我以后可以恢復它?
我四處搜索,發現了Pickle
& JSON
所做的序列化,但它們對我來說真的沒有意義,我也不明白如何在這里實現它們。
編碼:
from random import randint
from tkinter import *
dictionary=[]
with open('Dictionary.txt', 'r') as words:
dictionary = [word.split('\n')[0] for word in words]
root= Tk()
root.title('')
root.geometry('300x500')
#progress = 0
def yes_():
#select a random number
n = randint(0,len(dictionary))
#pass to list and print word on label
global l
l.grid_forget()
l = Label(root, text = dictionary[n])
l.config(font=('Arial', 25))
l.grid(row=0, padx=100, pady=100)
#remove that word
dictionary.remove(dictionary[n])
#progress += 1
def no_():
global l
l.grid_forget()
l = Label(root, text='test click')
l.config(font=('Arial', 25))
l.grid(row=0, padx=100, pady=100)
l = Label(root, text='Hello')
l.config(font=('Arial', 30))
l.grid(row=0, padx=100, pady=100)
question = Label(root, text='Do you know this word?', anchor='center')
question.config(font=('Arial', 12))
question.grid(row=1, pady=20)
by = Button(root, text='Yes', command=yes_)
by.config(font=('Arial', 15))
by.grid(row=2, ipadx=20)
bn = Button(root, text='No', command=no_)
bn.config(font=('Arial', 15))
bn.grid(row=3, pady=10, ipadx=26)
root.mainloop()
編輯1:
好的,所以在@fernandezr 和@Cool 的建議之后,我進行了一些搜索,我能夠將更改后的列表dictionary
保存到泡菜中。 (我沒有得到@acw1668 和@Tkinter 所說的話,對不起,伙計們)但是現在我如何讓它重新加載,以便當我再次打開程序時它會從那里恢復?
代碼位:
def on_close():
with open(r'C:\Users\Tos\Documents\t.pickle', 'wb') as text:
pickle.dump(dictionary, text)
root.destroy()
...
root.protocol('WM_DELETE_WINDOW', on_close)
root.mainloop()
好的,所以對於我的具體情況,我找到了解決方案。 在我的問題中,我進行了編輯,發現如何保存程序,確切地說,我能夠制作一個有效的保存機制。 對於加載機制,我只需要加載該保存的文件(如@acw1668 所建議的那樣)並將其分配給變量dictionary
,這會將由.txt
文件創建的原始列表替換為來自pickle
d 文件的更改列表。
整個代碼:
from random import randint
from tkinter import *
import pickle
dictionary=[]
with open('Dictionary.txt', 'r') as words:
dictionary = [word.split('\n')[0] for word in words]
root= Tk()
root.title('')
root.geometry('300x500')
def on_close():
with open(r'C:\Users\Tos\Documents\t.pickle', 'wb') as t_pickle:
pickle.dump(dictionary, t_pickle)
root.destroy()
def yes_():
n = randint(0,len(dictionary))
global text_label
text_label.grid_forget()
text_label = Label(root, text = dictionary[n])
text_label.config(font=('Arial', 25))
text_label.grid(row=0, padx=100, pady=100)
dictionary.remove(dictionary[n])
def no_():
global text_label
text_label.grid_forget()
text_label = Label(root, text='test click')
text_label.config(font=('Arial', 25))
text_label.grid(row=0, padx=100, pady=100)
try:
with open(r'C:\Users\Tos\Documents\t.pickle', 'rb') as t_pickle:
dictionary = pickle.load(t_pickle)
except FileNotFoundError:
pass
text_label = Label(root, text='Hello')
text_label.config(font=('Arial', 30))
text_label.grid(row=0, padx=100, pady=100)
question = Label(root, text='Do you know this word?', anchor='center')
question.config(font=('Arial', 12))
question.grid(row=1, pady=20)
by = Button(root, text='Yes', command=yes_)
by.config(font=('Arial', 15))
by.grid(row=2, ipadx=20)
bn = Button(root, text='No', command=no_)
bn.config(font=('Arial', 15))
bn.grid(row=3, pady=10, ipadx=26)
root.protocol('WM_DELETE_WINDOW', on_close)
root.mainloop()
如果您想知道我為什么使用try..except
塊,那么原因是用戶第一次打開程序時不會有任何可用的保存文件,所以讓錯誤輕松通過。 這也適用於退出時保存程序的部分創建文件,因此可以繼續進行進度。
最后我想說的是,雖然我得到了我想要的,但我覺得這是一種解決方法。 我期待 python 有一些 function 或實現保存/加載功能的東西; 也許確實如此,但我不知道,我不是 python 的專家。 可能我的問題措辭不正確。 我仍然有興趣知道如何暫停/保存正在運行的程序的 state,我發現許多 stackeroverflow 用戶都在問同樣的問題,但沒有得到預期的答案。 如果有人知道在 python 中運行程序存在保存/加載/暫停功能,請鏈接它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.