Я хочу, чтобы эта программа запоминала настройки - PullRequest
0 голосов
/ 05 июля 2010

Я несколько раз безуспешно пытался заставить программы запоминать настройки после их уничтожения.Большая причина этого заключается в том, что у меня нет примера кода для работы.Ниже у меня есть простая программа, которую я написал.Мне бы хотелось, чтобы он запоминал положение шкалы и содержимое текстового виджета при перезапуске программы.Я ненавижу просить кого-то написать код для меня, но я честно застрял.

Я использую Python 2.6.5 на Windows 7, кстати.

Код:

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 ]

3 голосов
/ 05 июля 2010

Дело не в том, чтобы просить людей писать код для вас, но зная, что искать, вы можете написать свой собственный код после этого!

Я думаю, что запоминание настроек, которые вы описываете, обычно выполняется двумя способами:

  1. Файл конфигурации
  2. Записи реестра

Затем вы можете прочитать сохраненное значение из файла / реестра конфигурации всякий раз, когда ваша программа загружается, иизмените параметры в соответствии.

Итак, теперь вы посмотрите, как вы читаете / записываете файлы / записи реестра, и все готово!

2 голосов
/ 05 июля 2010

В зависимости от того, как вы предпочитаете хранить настройки, вы также можете посмотреть такие вещи, как Shelve и Pickle / cPickle. Лично я предпочитаю Shelve, потому что я склонен использовать словари в качестве контейнеров настроек, а Shelve позволяет мне хранить их как есть. Полная документация доступна здесь: http://docs.python.org/library/shelve.html

1 голос
/ 05 июля 2010

Ваш предыдущий вопрос, где у вас возникли трудности с сохранением состояния с помощью cPickle, был хорошим началом.

Я добавил пару методов в ваш код, и теперь он будет сохранять и загружать данные в Scale иText виджеты с использованием модуля pickle.Я никогда не использовал Shelve - это звучит так, как будто это будет проще, основываясь на том, что gddc говорит в своем (?) Ответе.

Я сохраняю значения виджетов в словаре, затем выбираю словарь.

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...