Форум сайта python.su
0
У меня возник вопрос. Если путь к читаемому (записываемому) файлу изменился, как прописать возможность программы отслеживать это изменение и менять соответствующий код?
К примеру есть такая запись:
f=open('D:\Таблицы2.py','r',encoding='utf-8') f.read() f.close()
Офлайн
568
никак
Офлайн
294
Konstantin1984+что значит изменился? его переименовали, или переместили в другую директорию? на другой диск? когда это произошло? когда программа не запущена или во время выполнения программы?
Если путь к читаемому (записываемому) файлу изменился
[code python][/code]
Отредактировано PEHDOM (Фев. 6, 2020 18:16:01)
Офлайн
0
Вопрос в том, чтобы в случае передачи другому пользователю (на другой компьютер) программы, в инструкции которой указан адрес конкретного файла (для чтения и записи), программа могла сориентироваться с адресом файла на другом компьютере.
А глобально в данном случае мне интересен вопрос сохранения созданных в процессе работы программы виджетов, чтобы при повторном запуске программы они отображались.
Офлайн
253
Приведите инструкцию как пользователь будет запускать вашу программу.
В простейшем случае, достаточно использовать относительный путь (в каждой паке будут свои виджеты).
Если это общие ресурсы то можно писать в предопределенные места Которые гарантированно существуют.
В папку в которой расположен скрипт (см переменную __FILE__) внутрь питона см. https://docs.python.org/3/library/sys.html#sys.path или во временную директорию tmpdir
Офлайн
294
Konstantin1984+так для этого умные люди придумали файлы конфигурации специательные(обычно там простой текст, но особые извращенцы любят их хранить в бинарном виде), где данные храняться в виде ключ=значение, куда “другой пользователь” может вписать путь к своему файлу. А программа при запуске этот файл открывает и считывает из него значение нужного ключа.
Вопрос в том, чтобы в случае передачи другому пользователю (на другой компьютер) программы, в инструкции которой указан адрес конкретного файла (для чтения и записи), программа могла сориентироваться с адресом файла на другом компьютере.
Konstantin1984+опять же сами виджеты вы хранить не сможете, они создаются каждый раз заново при запуске программы, но в тех же файлах конфигурации вы вполне можете хранить все что угодно: размер окна, его местоположения, какие виджеты были в окнах и какие данные были в виджетах.Программа перед закрытием туды записывает все, а при запуске считывает и создает виджеты с задаными параметрами.
А глобально в данном случае мне интересен вопрос сохранения созданных в процессе работы программы виджетов, чтобы при повторном запуске программы они отображались.
[code python][/code]
Офлайн
0
Уважаемый PEHDOM, можете ли Вы привести какой-нибудь простой пример использования файлов конфигурации (то есть выложить на форум основной файл и файл конфигурации)?
Для примера можно взять простую программу, которая создает какие-нибудь кнопки или окна и при повторном запуске воспроизводит эти виджеты.
Офлайн
294
ну вот например простейший “текстовы редактор” сделаный на коленке за пол-часа:
import sys from tkinter import * from tkinter.filedialog import * import configparser CONFIG_FILE='config.ini' class Editor(): def __init__(self, master, width=800, height=600, x=0, y=0, last_file=None): self.master = root self.master.title('simple text editor') self.master.geometry('{}x{}+{}+{}'.format(width,height, x, y)) self.text=Text(self.master) self.text.pack(fill=BOTH, expand=1) # ----- главное меню ----- m = Menu(self.master) self.master.config(menu=m) #----- меню "Фалй" ----- file_menu = Menu(m) m.add_cascade(label="File",menu=file_menu) file_menu.add_command(label="Open...",command=self._open) file_menu.add_command(label="Save...",command=self._save) file_menu.add_separator() file_menu.add_command(label="Exit",command=self._exit) self.master.protocol("WM_DELETE_WINDOW", self._exit) self.opened_file = last_file if last_file: with open(last_file, "r") as f: self.text.insert(END,f.read()) self.master.mainloop() def _save(self): t = self.text.get("1.0", END) savelocation=asksaveasfilename() if savelocation: with open(savelocation, "w+") as f: f.write(t) self.opened_file = savelocation def _open(self): openlocation=askopenfilename() if openlocation: self.text.delete("1.0",END) with open(openlocation, "r") as f: self.text.insert(END,f.read()) self.opened_file = openlocation def _exit(self): # при закрытии окна, мы сохраняем параметры окна в конфиг файл print('saving {}'.format(CONFIG_FILE)) parser = configparser.ConfigParser() parser['MAIN']={} parser['MAIN']['width']=str(self.master.winfo_width()) parser['MAIN']['height']=str(self.master.winfo_height()) parser['MAIN']['x']=str(self.master.winfo_x()) parser['MAIN']['y']=str(self.master.winfo_y()) if self.opened_file: parser['MAIN']['last_file']=self.opened_file with open(CONFIG_FILE, 'w') as configfile: parser.write(configfile) self.master.destroy() if __name__ == '__main__': config = dict(width=300, height=200, x=0, y=0, last_file=None) parser = configparser.ConfigParser() # тут мы открывваем файл кнфигурации и читаем из него parser.read(CONFIG_FILE) if 'MAIN' in parser: for key in config: if key in parser['MAIN']: config[key] = parser['MAIN'][key] root=Tk() editor = Editor(root, **config)
[MAIN]
width = 608
height = 487
x = 198
y = 20
last_file =
[code python][/code]
Отредактировано PEHDOM (Фев. 7, 2020 12:53:41)
Офлайн
0
Спасибо! Солидно, буду разбираться.
Офлайн