Tkinter сохранения документа с паролем
Пишу текстовый редактор на Python3.8 Tkinter и хочу реализовать чтобы можно было при сохранении файла присваивать ему пароль и потом когда его открывать то просило пароль? Как это можно сделать
Ответы (2 шт):
Автор решения: Андрей Григорьев
→ Ссылка
Самое простое, но не самое надежное решение:
import json
from tkinter import simpledialog as sd, messagebox as mb
# Функция, сохраняющая заданный текст с заданным паролем по заданному пути
def save_with_password(text, password, path):
obj = {'text': text, 'password': password}
to_save = open(path, 'w')
to_save.write(json.dumps(obj))
to_save.close()
# Функция, открывающая запароленный файл
def open_passworded_file(path):
f = open(path, 'r')
data = json.loads(f.read())
f.close()
password = sd.askstring(title="Ввод данных", prompt="Введите пароль")
if password == data['password']:
return data['text']
else:
mb.showerror('Ошибка','Неверный пароль')
Чтобы сделать надежнее - можно кодировать то, что записываем в файл, а при чтении декодировать
Пример с самым простым кодированием/декодированием:
import json
from tkinter import simpledialog as sd, messagebox as mb
import base64
# Функция, сохраняющая заданный текст с заданным паролем по заданному пути
def save_with_password(text, password, path):
obj = {'text': text, 'password': password}
to_save = open(path, 'w')
data = json.dumps(obj)
encoded_data = base64.b64encode(data.encode()).decode()
to_save.write(encoded_data) # сохранится казалось бы всякая абра кадабра
to_save.close()
# Функция, открывающая запароленный файл
def open_passworded_file(path):
f = open(path, 'r')
encoded_data = f.read()
f.close()
json_text = base64.b64decode(encoded_data.encode()).decode()
data = json.loads(json_text)
password = sd.askstring(title="Ввод данных", prompt="Введите пароль")
if password == data['password']:
return data['text']
else:
mb.showerror('Ошибка','Неверный пароль')
Автор решения: user554513
→ Ссылка
Я использую модуль pickle.
import pickle
def write(text, password, way):
data = {
'password' : password,
'text' : text
}
file = open(way, 'wb')
pickle.dump(data, file)
file.close()
def read(way, password):
file = open(way, 'rb')
data = pickle.load(file)
file.close()
if password == data['password']:
return data['text']
else:
print('Error, wrong password')