Найти - Пользователи
Полная версия: Изменение пути к редактируемому файлу
Начало » Python для новичков » Изменение пути к редактируемому файлу
1
Konstantin1984+
У меня возник вопрос. Если путь к читаемому (записываемому) файлу изменился, как прописать возможность программы отслеживать это изменение и менять соответствующий код?
К примеру есть такая запись:

  f=open('D:\Таблицы2.py','r',encoding='utf-8')
        f.read()
        f.close()
FishHook
никак
PEHDOM
Konstantin1984+
Если путь к читаемому (записываемому) файлу изменился
что значит изменился? его переименовали, или переместили в другую директорию? на другой диск? когда это произошло? когда программа не запущена или во время выполнения программы?
Вопрос в масштабах. По сути утилит или либ для пайтона котороые отслеживают рекурсивно изменения в конкретной директории, хоть попой кушай , гуглите watchdog, watcher, filesystemwatcher и пр..
Если вам надо глобально отслеживать на локальном компьютере, типа на-всех-дисках-во-всех-папках, то забудте, вам нужно будет писать драйвер ядра, на Си, для венды, который будет перехватывать и логировать все операции драйвера ФС. можете посмотреть на готовый продукт от сисинтерналс https://docs.microsoft.com/en-us/sysinternals/downloads/procmon
Konstantin1984+
Вопрос в том, чтобы в случае передачи другому пользователю (на другой компьютер) программы, в инструкции которой указан адрес конкретного файла (для чтения и записи), программа могла сориентироваться с адресом файла на другом компьютере.

А глобально в данном случае мне интересен вопрос сохранения созданных в процессе работы программы виджетов, чтобы при повторном запуске программы они отображались.

doza_and
Приведите инструкцию как пользователь будет запускать вашу программу.

В простейшем случае, достаточно использовать относительный путь (в каждой паке будут свои виджеты).

Если это общие ресурсы то можно писать в предопределенные места Которые гарантированно существуют.

В папку в которой расположен скрипт (см переменную __FILE__) внутрь питона см. https://docs.python.org/3/library/sys.html#sys.path или во временную директорию tmpdir
PEHDOM
Konstantin1984+
Вопрос в том, чтобы в случае передачи другому пользователю (на другой компьютер) программы, в инструкции которой указан адрес конкретного файла (для чтения и записи), программа могла сориентироваться с адресом файла на другом компьютере.
так для этого умные люди придумали файлы конфигурации специательные(обычно там простой текст, но особые извращенцы любят их хранить в бинарном виде), где данные храняться в виде ключ=значение, куда “другой пользователь” может вписать путь к своему файлу. А программа при запуске этот файл открывает и считывает из него значение нужного ключа.
Konstantin1984+
А глобально в данном случае мне интересен вопрос сохранения созданных в процессе работы программы виджетов, чтобы при повторном запуске программы они отображались.
опять же сами виджеты вы хранить не сможете, они создаются каждый раз заново при запуске программы, но в тех же файлах конфигурации вы вполне можете хранить все что угодно: размер окна, его местоположения, какие виджеты были в окнах и какие данные были в виджетах.Программа перед закрытием туды записывает все, а при запуске считывает и создает виджеты с задаными параметрами.


Konstantin1984+
Уважаемый PEHDOM, можете ли Вы привести какой-нибудь простой пример использования файлов конфигурации (то есть выложить на форум основной файл и файл конфигурации)?
Для примера можно взять простую программу, которая создает какие-нибудь кнопки или окна и при повторном запуске воспроизводит эти виджеты.
PEHDOM
ну вот например простейший “текстовы редактор” сделаный на коленке за пол-часа:
 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)
при выходе от записывает в config.ini размер и положение окна, и последний отктрытый файл в виде:
[MAIN]
width = 608
height = 487
x = 198
y = 20
last_file =
а при следующем запуске, от читает из файла эти данные, созает окно такого же размера, в том же месте, и показывает текст последнего отрытого файла…

Konstantin1984+
Спасибо! Солидно, буду разбираться.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB