Python 我想让这个程序记住设置

Python 我想让这个程序记住设置,python,memory,tkinter,Python,Memory,Tkinter,我曾多次尝试让程序在被销毁后记住设置,但都没有成功。这样做的一个重要原因是,我没有一个示例代码可以使用。下面是我写的一个简单的程序。我希望它能够记住刻度的位置,以及重新启动程序时文本小部件的内容。我讨厌让别人帮我写代码,但我真的被卡住了 顺便说一句,我正在Windows7上使用Python 2.6.5 代码: import Tkinter class simpleapp_tk(Tkinter.Tk): def __init__(self,parent): Tkinte

我曾多次尝试让程序在被销毁后记住设置,但都没有成功。这样做的一个重要原因是,我没有一个示例代码可以使用。下面是我写的一个简单的程序。我希望它能够记住刻度的位置,以及重新启动程序时文本小部件的内容。我讨厌让别人帮我写代码,但我真的被卡住了

顺便说一句,我正在Windows7上使用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()

这不是要求人们为您编写代码的问题,而是知道要寻找什么,之后您可以编写自己的代码

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

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


    现在,您可以查看如何读取/写入文件/注册表项,并进行设置

    这不是要求人们为您编写代码的问题,而是知道要寻找什么,之后您可以编写自己的代码

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

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


    现在,您可以查看如何读取/写入文件/注册表项,并进行设置

    根据您喜欢存储设置的方式,您还可以查看Shelve和Pickle/cPickle之类的内容。我个人更喜欢Shelve,因为我倾向于使用字典作为设置容器,Shelve允许我按原样存储它们。此处提供完整文档:

    根据您喜欢存储设置的方式,您还可以查看Shelve和Pickle/cPickle等内容。我个人更喜欢Shelve,因为我倾向于使用字典作为设置容器,Shelve允许我按原样存储它们。此处提供完整的文档:

    您以前的问题是,您在使用cPickle保存状态时遇到困难,这是一个很好的开始

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

    我将小部件值存储在字典中,然后对字典进行pickle处理

    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()
    

    您之前的问题是,在使用cPickle保存状态时遇到困难,这是一个良好的开端

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

    我将小部件值存储在字典中,然后对字典进行pickle处理

    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()
    

    老实说,我不知道该给这个问题什么样的答案。如果你能具体说明你遇到了什么问题,那就更好了——你之前的问题在这方面做得更好。我已经试过好几次了,但所有的代码都没有起作用。我所需要的只是让一个代码工作一次,这样我就可以通过反复试验来建立它。@anteater,你试过什么?上面的代码与持久化设置没有任何关系。我建议您尝试一下,它内置于标准库中。这里有一些例子,包括在网上。老实说,我不知道该给这个问题什么样的答案。如果你能具体说明你遇到了什么问题,那就更好了——你之前的问题在这方面做得更好。我已经试过好几次了,但所有的代码都没有起作用。我所需要的只是让一个代码工作一次,这样我就可以通过反复试验来建立它。@anteater,你试过什么?上面的代码与持久化设置没有任何关系。我建议您尝试一下,它内置于标准库中。这里有一些例子,包括上面的。谢谢,这正是我想要的。现在我有了一个足够的示例代码,谢谢,这正是我想要的。现在我有了一个足够的示例代码。