gpt4 book ai didi

Python - 在重新启动之间保存程序状态?

转载 作者:太空宇宙 更新时间:2023-11-03 14:29:17 24 4
gpt4 key购买 nike

我想知道如何保存程序的当前设置,以使其在程序重新启动或计算机重新启动时保持不变,除非另有说明。例如,windows默认程序便签,它保存文本的地方,这样即使在计算机关闭后也可以使用。

是否有某种模块可以导入?我的程序基本上是一个任务列表程序,您可以在其中向列表添加内容,并使用 wxPython 复选框将其勾选。有什么方法可以在程序退出后保持它的状态吗?

如果有人可以用我的代码向我展示一个示例,我将不胜感激,别担心,我不会简单地复制它并完成它。对我来说,这将被视为一种学习经验,以便我将来可以使用它。谢谢。

这是我的程序:

import wx, sys,os

mylist = []

class test(wx.Frame):

def __init__(self, parent, id):


self.count = 1
#Frame
wx.Frame.__init__(self,parent,id,'List',size = (200,500))
#Panel
self.panel = wx.Panel(self)
item = wx.TextEntryDialog(None, "List Title")
if item.ShowModal() == wx.ID_OK:
print 'here'
answer = item.GetValue()
mylist.append(answer)
print mylist
windtitle = wx.StaticText(self.panel, -1, answer, (10,10))
windtitle.SetForegroundColour("blue")


addButton = wx.Button(self.panel, label = "+ Add", pos=(40,450), size = (60,-1))
finishButton = wx.Button(self.panel, label = "Finish", pos=(110,450), size = (60,-1))

self.Bind(wx.EVT_BUTTON, self.addtomenu, addButton)
self.Bind(wx.EVT_BUTTON, self.finish, finishButton)

def finish(self, event):
self.Destroy()
sys.exit()

def addtomenu(self,event):

newitem = wx.TextEntryDialog(None, "New Item")
if newitem.ShowModal() == wx.ID_OK:
count = len(mylist)+1
print count
yaxis = 20*count
if count == 21:
wx.StaticText(self.panel, -1, "List To Full", (10, yaxis))
else:
answer = newitem.GetValue()
mylist.append(answer)
print mylist
self.Bind(wx.EVT_CLOSE, self.closewindow)
wx.CheckBox(self.panel, -1, answer, (10,yaxis), size = (200,-1))



def closewindow(self, event):
self.Destroy()






if __name__ == "__main__":
app=wx.PySimpleApp() #Blood
frame = test(parent=None, id = -1) #Skin
frame.Show()
app.MainLoop() #Heart

最佳答案

这是一个示例,说明如何将程序状态保存在 JSON 文件中。您已经有一个 finish 方法,该方法在程序退出或关闭 Finish 按钮时调用。我们现在还可以使用它来调用 save 方法,该方法将状态保存到 JSON 文件中。

def finish(self, event):
self.save()
self.Destroy()
sys.exit()

def save(self):
windtitle = self.windtitle.GetLabelText()
checkboxes = [{'checked': child.IsChecked(),
'label': child.GetLabel()}
for child in self.panel.GetChildren()
if isinstance(child, wx.CheckBox)]
data = {
'windtitle':windtitle,
'checkboxes':checkboxes,
}
with open(CONFIGFILE, 'w') as f:
json.dump(data, f)

下面是读取 JSON 数据以重构 GUI 的方法:

def load(self):
if os.path.exists(CONFIGFILE):
with open(CONFIGFILE, 'r') as f:
data = json.load(f)
title = data['windtitle']
self.windtitle = wx.StaticText(self.panel, -1, title)
self.vbox.Add(self.windtitle)
for checkbox in data['checkboxes']:
label = checkbox['label']
cb = wx.CheckBox(
self.panel, -1, checkbox['label'])
self.vbox.Add(cb)
cb.SetValue(checkbox['checked'])
else:
self.create_windtitle()
self.create_buttons()

例如:

import wx, sys, os
import json

CONFIGFILE = os.path.expanduser('~/tasklist.json')
class test(wx.Frame):
def __init__(self, parent, id):
frame = wx.Frame.__init__(self, parent, id, 'List', size = (200,500))
self.panel = wx.Panel(self)
self.panelbox = wx.BoxSizer(wx.VERTICAL)

self.vbox = wx.BoxSizer(wx.VERTICAL)
self.load()

self.panelbox.Add(self.vbox)
self.panelbox.Add(self.buttonbox)

self.panel.SetSizer(self.panelbox)
self.panelbox.Fit(self)

self.Bind(wx.EVT_BUTTON, self.addtomenu, self.addButton)
self.Bind(wx.EVT_BUTTON, self.finish, self.finishButton)
self.Bind(wx.EVT_CLOSE, self.finish)

def create_buttons(self):
self.buttonbox = wx.BoxSizer(wx.VERTICAL)
self.addButton = wx.Button(
self.panel, label = "+ Add")
self.finishButton = wx.Button(
self.panel, label = "Finish")
self.buttonbox.Add(self.addButton)
self.buttonbox.Add(self.finishButton)

def create_windtitle(self):
item = wx.TextEntryDialog(None, "List Title")
if item.ShowModal() == wx.ID_OK:
answer = item.GetValue()
self.windtitle = wx.StaticText(self.panel, -1, answer)
self.windtitle.SetForegroundColour("blue")

def addtomenu(self, event):
newitem = wx.TextEntryDialog(None, "New Item")
if newitem.ShowModal() == wx.ID_OK:
if len(self.mylist) > 5:
wx.StaticText(self.panel, -1, "List To Full")
else:
answer = newitem.GetValue()
cb = wx.CheckBox(self.panel, -1, answer)
self.vbox.Add(cb)
self.panelbox.Fit(self)

def finish(self, event):
self.save()
self.Destroy()
sys.exit()

@property
def mylist(self):
return [ child.GetLabel()
for child in self.panel.GetChildren()
if isinstance(child, wx.CheckBox) ]

def save(self):
windtitle = self.windtitle.GetLabelText()
checkboxes = [{'checked': child.IsChecked(),
'label': child.GetLabel()}
for child in self.panel.GetChildren()
if isinstance(child, wx.CheckBox)]
data = {
'windtitle':windtitle,
'checkboxes':checkboxes,
}
with open(CONFIGFILE, 'w') as f:
json.dump(data, f)

def load(self):
if os.path.exists(CONFIGFILE):
with open(CONFIGFILE, 'r') as f:
data = json.load(f)
title = data['windtitle']
self.windtitle = wx.StaticText(self.panel, -1, title)
self.vbox.Add(self.windtitle)
for checkbox in data['checkboxes']:
label = checkbox['label']
cb = wx.CheckBox(
self.panel, -1, checkbox['label'])
self.vbox.Add(cb)
cb.SetValue(checkbox['checked'])
else:
self.create_windtitle()
self.create_buttons()

if __name__ == "__main__":
app = wx.PySimpleApp() #Blood
frame = test(parent = None, id = -1) #Skin
frame.Show()
app.MainLoop() #Heart

顺便说一句,不要使用明确的位置在您的 GUI 中放置小部件。那条路通向疯狂。如果您使用位置(例如 pos = (10,yaxis)),随着 GUI 的增长,修改布局会变得越来越困难。每个元素的位置都依赖于其他元素的位置,很快就会变得难以管理。

每个 GUI 框架都提供了一些更明智的方法来实现漂亮的布局。我对wxpython不是很熟悉,不过好像用到了BoxSizers。我上面使用的布局非常简陋。我确信通过对 wxpython 布局设计模式的一些研究可以实现更好的布局。


有时我需要找出小部件的所有属性和方法是什么。例如,我不知道如何询问面板它包含哪些复选框。我发现它使用这个函数:

def describe(obj):
for key in dir(obj):
try:
val = getattr(obj, key)
except AttributeError:
continue
if callable(val):
help(val)
else:
print('{k} => {v}'.format(k = key, v = val))
print('-'*80)

describe(self.panel)

这是我在 utils_debug 中的函数。

关于Python - 在重新启动之间保存程序状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14183288/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com