簡體   English   中英

如何在 python 中准確保存程序的 state?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM