我想让这个程序记住设置

时间:2010-07-05 02:32:52

标签: python memory tkinter

我多次试图让程序在被销毁后记住设置,但没有成功。一个很大的原因是因为我没有一个示例代码可以解决。下面我写了一个简单的程序。我希望它能够在重新启动程序时记住比例的位置和文本小部件的内容。我不想让别人为我编写代码,但老实说我坚持了。

我在Windows 7,BTW上使用Python 2.6.5。

代码:

import Tkinter


class simpleapp_tk(Tkinter.Tk):
    def __init__(self,parent):
        Tkinter.Tk.__init__(self,parent)
        self.parent = parent
        self.initialize()

    def initialize(self):
        self.sclX = Tkinter.Scale(self, from_=0, to=100, orient='horizontal',resolution=1,command=self.A)
        self.sclX.pack(ipadx=75)


        self.labelVar = Tkinter.StringVar()
        self.label = Tkinter.Label(self,textvariable=self.labelVar)
        self.label.pack(ipadx=75)


        self.frame = Tkinter.Frame(self,relief='ridge',borderwidth=4)
        self.frame.pack()
        self.LVariable = Tkinter.StringVar()
        self.s = Tkinter.Scrollbar(self.frame)
        self.L = Tkinter.Text(self.frame,borderwidth=0,font=('Arial', 10),width=30, height=15)
        self.s.config(command=self.L.yview,elementborderwidth=1)
        self.L.grid(column=0,row=0,sticky='EW')
        self.s.grid(column=1,row=0,sticky='NSEW')


    def A(self, event):
        self.labelVar.set(100 - self.sclX.get())


if __name__ == "__main__":
    app = simpleapp_tk(None)
    app.mainloop()

3 个答案:

答案 0 :(得分:3)

这不是要求人们为您编写代码而是知道要查找的内容,您可以在此之后编写自己的代码!

我认为记住你描述的设置通常有两种方式:

  1. 配置文件
  2. 注册表项
  3. 然后,您可以在程序加载时从配置文件/注册表中读取存储的值,并调整参数以匹配。

    所以现在你去查看你如何读/写文件/注册表项并设置好了!

答案 1 :(得分:2)

根据您喜欢存储设置的方式,您还可以查看Shelve和Pickle / cPickle等内容。我个人更喜欢Shelve,因为我倾向于使用字典作为设置容器而Shelve让我按原样存储它们。完整文档可在此处获取:http://docs.python.org/library/shelve.html

答案 2 :(得分:1)

您之前使用cPickle保存状态有困难的问题是一个良好的开端。

我已经为您的代码添加了几种方法,现在它将使用Scale模块在​​Textpickle小部件中保存和加载数据。我从来没有使用过Shelve - 根据g.d.d.c在他的(?)答案中的说法,这听起来会更容易。

我将小部件值存储在字典中,然后挑选字典。

import Tkinter
import pickle

class simpleapp_tk(Tkinter.Tk):
    def __init__(self, parent=None):
        Tkinter.Tk.__init__(self, parent)
        self.parent = parent
        self.initialize()
        self.load_data()
        self.protocol("WM_DELETE_WINDOW", self.save_data)

    def initialize(self):
        self.sclX = Tkinter.Scale(self, from_=0, to=100, orient='horizontal',
            resolution=1,command=self.update_label)
        self.sclX.pack(ipadx=75)

        self.labelVar = Tkinter.StringVar()
        self.label = Tkinter.Label(self,textvariable=self.labelVar)
        self.label.pack(ipadx=75)

        self.frame = Tkinter.Frame(self,relief='ridge',borderwidth=4)
        self.frame.pack()
        #self.LVariable = Tkinter.StringVar()
        self.s = Tkinter.Scrollbar(self.frame)
        self.L = Tkinter.Text(self.frame, borderwidth=0, font=('Arial', 10),
            width=30, height=15)
        self.s.config(command=self.L.yview, elementborderwidth=1)
        self.L.grid(column=0, row=0, sticky='EW')
        self.s.grid(column=1, row=0, sticky='NSEW')

    def update_label(self, event):
        self.labelVar.set(100 - self.sclX.get())

    def save_data(self):
        data = {'scale': self.sclX.get(), 'text': self.L.get('1.0', 'end')}
        with file('config.data', 'wb') as f:
            pickle.dump(data, f)
        self.destroy()

    def load_data(self):
        try:
            with file('config.data', 'rb') as f:
                data = pickle.load(f)
                self.sclX.set(data['scale'])
                self.L.insert("end", data['text'])
        except IOError:
            # no config file exists
            pass

if __name__ == "__main__":
    app = simpleapp_tk()
    app.mainloop()