file_name = '1textfile.txt'
init_str = open(file_name, 'r').read()
sens_str = []
sen_str = init_str[:2]
end_sen = ['.', '?', '!', '…']
# list состоящий из строк-предложений
for i in range(2, len(init_str)):
# Если большая буква и пробел с .!? ИЛИ не маленькая буква и \n
if (init_str[i].istitle() and init_str[i-2] in end_sen) or (not ('a' <= init_str[i] <= 'z') and init_str[i-1]=='\n'): # Разделение по \n, и если следующая строка НЕ начинается с строчной буквы запись предложения
sens_str.append(sen_str)
sen_str = init_str[i]
# Если символ последний записываем предложение
elif i==len(init_str)-1:
sen_str += init_str[i]
sens_str.append(sen_str)
# Иначе дописываем символ в предложение-строку
else:
sen_str += init_str[i]
sens_list = [] # list всех предложений состоящих из list
# list состоящий из list-предложений
for sen_str in sens_str:
sen_list = [] # Предложение list состоящее из слов и символов
new = '' # Для добавления новых символов
apostrophe = False
# Первый символ
if sen_str[0].isalpha():
word = True
else:
word = False
# Перебор символов для разделения str-предложений на слова и символы
rang = range(0, len(sen_str))
for i in rang:
# Апостроф
if sen_str[i]=="'" and (i-1 in rang and i+1 in rang):
if sen_str[i-1].isalpha() and sen_str[i+1].isalpha():
apostrophe = True
# Если буква или апостроф (в слове)
if sen_str[i].isalpha() or apostrophe:
if word:
new += sen_str[i]
if apostrophe:
apostrophe = False
else:
sen_list.append(new)
new = sen_str[i]
word = True
# Если символ
else:
if word:
sen_list.append(new)
new = sen_str[i]
word = False
else:
new += sen_str[i]
# Последний символ (в тч буква)
sen_list.append(new)
# В list предложений добавляем list предложения разбитого по словам и символам
sens_list.append(sen_list)
# Парсер яндекс переводчика по офицальному api
import re
from tkinter import *
import requests
class Application(Frame):
'''Начинаем с первого (s=0) предложения'''
def __init__(self, master):
super(Application, self).__init__(master)
self.grid()
s = 0
sen_list = sens_list[s]
self.first = False # Для функции translate
self.init_buttons(s, sen_list)
def init_buttons(self, s, sen_list):
# Распаковка словаря из файла в список
slovar = open('slovar.txt', 'r').read()
slovar = re.split(r' - |\n', slovar) # 2-й вариант разделения slovar.replace('\n', ' - ').split(' - ')
mslovar = open('mslovar.txt', 'r').read()
mslovar = re.split(r' - |\n', mslovar)
# Переход к предыдущему предложению
if s!=0:
self.nex = Button(self, text = "PREV", command = lambda: self.prev(s))
self.nex.grid(row = 0, column = 0)
# Переход к следующему предложению
if s!=len(sens_list)-1:
self.nex = Button(self, text = "NEXT", command = lambda: self.nexet(s))
self.nex.grid(row = 0, column = 1)
# Слова из предложения
for i, word in enumerate(sen_list):
i = i + 2 # Две кнопки в начале (Prev Next)
word = word.lower()
# Неизвестное слово
if word[0].isalpha() and word not in mslovar and word not in slovar: # Если элемент списка частей предложения именно слово И оно не в мсловаре и словаре
self.bttn = Button(self)
self.bttn["text"] = word
self.bttn.bind("<Button-1>", lambda event, i=i, word_eng = self.bttn['text']: self.translate(word_eng, i))
self.bttn.grid(row = 0, column = i)
# Слово из словаря, но его можно переопределить
elif word in slovar:
self.bttn = Button(self, text = word + ' (' + slovar[slovar.index(word)+1] + ')')
self.bttn.bind("<Button-1>", lambda event, i=i, word = word: self.redicted_slovar(word, i))
self.bttn.grid(row = 0, column = i)
# Слово из мсловаря или символ
else:
self.bttn = Button(self, text = word) #+ ' (' + slovar[slovar.index(word)+1] + ')')
self.bttn.bind("<Button-1>", lambda event, i=i, word = word: self.redicted_mslovar(word, i))
self.bttn.grid(row = 0, column = i)
#self.bttn = Label(self, text = word).grid(row = 0, column = i)
def translate(self, word_eng, i):
r = requests.post(url, data={'key': key, 'text': word_eng, 'lang': lang, 'flags': 4})
res = r.json()
wslovar = open('slovar.txt', 'a').write('\n' + word_eng + ' - '); #wslovar.close()
self.first = True # Значит слово первый вариант перевода
t = 0 # Для позиционирования варианта перевода под словом
# Кнопки на каждый вариант перевода
for d in range(len(res['def'])):
for v in range(len(res['def'][d]['tr'])): # Это варианты сущ, гл, прил
t += 1
word_rus = res['def'][d]['tr'][v]['text'] # Это количество вариантов перевода для каждой части речи
self.bttn = Button(self, text = word_rus, command = lambda word_rus = word_rus: self.dicted(self.first, word_rus))
self.bttn.grid(row = t, column = i)
# Кнопка для добавления слова в mslovar
self.bttn = Button(self, text = 'msl', command = lambda: self.dicted_mslovar(word_eng)).grid(row = t+1, column = i)
# Запись в мой словарь и удаление из словаря
def dicted_mslovar(self, word_eng):
rslovar = open('slovar.txt', 'r').read()
i = rslovar.find('\n' + word_eng)
wslovar = open('slovar.txt', 'w').write(rslovar[:i])
wmslovar = open('mslovar.txt', 'a').write(rslovar[i:])
# Запись в словарь
def dicted(self, first, word_rus):
if first:
self.first = False
else:
word_rus = '/' + word_rus
wslovar = open('slovar.txt', 'a')
wslovar.write(word_rus)
wslovar.close()
def prev(self, s):
# Это удаление всех виджетов, которые есть на рамке
for widget in app.winfo_children():
widget.destroy()
s -= 1 # Переход к следующему предложению
sen_list = sens_list[s]
return self.init_buttons(s, sen_list)
def nexet(self, s):
# Это удаление всех виджетов, которые есть на рамке
for widget in app.winfo_children():
widget.destroy()
s += 1 # Переход к следующему предложению
sen_list = sens_list[s]
return self.init_buttons(s, sen_list)
# Удаление из словаря и переход к translate
def redicted_slovar(self, word_eng, ic):
rslovar = open('slovar.txt', 'r').read()
i = rslovar.find(word_eng) # Здесь слово начинается
if i in range(1, len(rslovar)): i = i-1 # Если оно не первое и есть \n перед ним тогда его тоже захватываем
y = rslovar.find('\n', i+1) # Здесь начинается следующее слово
if y == -1: y = len(rslovar) # Если следующего нет (-1 это исключение), то концом предыдущего слова считаем конец всего списка
nslovar = rslovar[:i] + rslovar[y:] # Переписываем весь словарь без переопределяемого слова
wslovar = open('slovar.txt', 'w')
wslovar.write(nslovar)
wslovar.close()
self.translate(word_eng, ic)
# Удаление из мсловаря и переход к translate
def redicted_mslovar(self, word_eng, ic):
rmslovar = open('mslovar.txt', 'r').read()
i = rmslovar.find(word_eng) # Здесь слово начинается
if i in range(1, len(rmslovar)): i = i-1 # Если оно не первое и есть \n перед ним тогда его тоже захватываем
y = rmslovar.find('\n', i+1) # Здесь начинается следующее слово
if y == -1: y = len(rmslovar) # Если следующего нет (-1 это исключение), то концом предыдущего слова считаем конец всего списка
nmslovar = rmslovar[:i] + rmslovar[y:] # Переписываем весь словарь без переопределяемого слова
wmslovar = open('mslovar.txt', 'w')
wmslovar.write(nmslovar)
wmslovar.close()
self.translate(word_eng, ic)
root = Tk()
root.title("Init Text Buttoned")
root.geometry("900x300")
app = Application(root)
root.mainloop()