import math
# константы
tMethod = 'LZ77'
sizeSymbol = 8 # размер 1го символа в битах
# функции
def readInputText(fileName):
tInput, nD, nB = '', 8, 5
try:
# пытаемся открыть файл на чтение
f = open(fileName, 'rt', encoding='utf-8')
except FileNotFoundError:
# файл не найден - запрашиваем параметры с консоли
tInput = input('\n введите исходное сообщение -').strip()
try:
nD = int(input('размер словаря (сим, default=8)-').strip())
except ValueError:
nD = 8
try:
nB = int(input('размер буфера (сим, default=5)-').strip())
except ValueError:
nB = 5
else:
# файл найден чтаем параметры из файла
tInputLines = f.readlines()
f.close()
for tLine in tInputLines:
if tLine[0:11] == 'tInputText=':
tInput = tLine[11:].strip()
elif tLine[0:6] == 'nDict=':
try:
nD = int(tLine[6:].strip())
except ValueError:
nD = 8
elif tLine[0:6] == 'nBuff=':
try:
nB = int(tLine[6:].strip())
except ValueError:
nB = 8
finally:
# выводим параметры на консоль
print('\n исхоное сообщение - {0}'.format(tInput))
print('размер словаря - {0} сим.'.format(nD))
print('размер буфера - {0} сим.'.format(nB))
# сохраняем параметры в файл
with open(fileName, 'wt', encoding='utf-8') as f:
f.write('tInputText={0}\n'.format(tInput))
f.write('nDict={0}\n'.format(nD))
f.write('nBuff={0}\n'.format(nB))
return tInput, nD, nB
# используем 36-ричную систему счисления для смещения и длины строки
def str36(num36):
if (num36 >= 0) and (num36 <= 9):
strNum = str(num36)
elif (num36 >= 10) and (num36 <= 36):
strNum = chr(0x0041 + num36 - 10) # ord('A') = 0x0041
else:
strNum = 'Error'
return strNum
##### вот здесь после else нужно добавить 3 строчки как сказал мой препод
def makeLZ77(d, ld, b, lb):
i = d.find(b[0])
# первый символ буфера в словаре не найден или это последний символ буфера
if (i == -1) or (i == len(b) - 1):
i = 0 # смещение
n = 0 # длина подстроки
Code = str36(i) + str36(n) + b[n] # код lz77
# первый символ буфера в словаре найден смещение - i
else:
n = 0 # длина подстроки
while (n < len(d) - i) and (n < len(b)) and (b[n] == d[i + n]):
# if n <= len(b):
n += 1
Code = str36(i) + str36(n) + b[n] # код lz77
sizeCode = ld + lb + sizeSymbol # размер 1го lz77 кода в битах
# сдвиг курсора код и размер кода
return [n + 1, Code, sizeCode]
#####
def makeOutputText(fileName, tInput, nD, nB):
print('\n' + 'метод {0}'.format(tMethod).center(max(nD, 7) + max(nB, 5) + 3 + 10))
print('=={0}==={1}==={2}=='.format(''.ljust(max(nD, 7), '='), ''.ljust(max(nB, 5), '='), ''.ljust(3, '=')))
print('| {0} | {1} | {2} |'.format('словарь'.center(max(nD, 7)), 'буфер'.center(max(nB, 5)), 'код'.center(3)))
print('|-{0}-|-{1}-|-{2}-|'.format(''.ljust(max(nD, 7), '-'), ''.ljust(max(nB, 5), '-'), ''.ljust(3, '-')))
f = open(fileName, 'wt', encoding='utf-8')
f.write('метод {0}'.format(tMethod).center(max(nD, 7) + max(nB, 5) + 3 + 10) + '\n')
f.write('=={0}==={1}==={2}==\n'.format(''.ljust(max(nD, 7), '='), ''.ljust(max(nB, 5), '='), ''.ljust(3, '=')))
f.write('| {0} | {1} | {2} |\n'.format('словарь'.center(max(nD, 7)), 'буфер'.center(max(nB, 5)), 'код'.center(3)))
f.write('|-{0}-|-{1}-|-{2}-|\n'.format(''.ljust(max(nD, 7), '-'), ''.ljust(max(nB, 5), '-'), ''.ljust(3, '-')))
nInput = len(tInput)
tOutput, sizeOutput = '', 0
k = 0
while k < nInput:
if k < nD: # определение содержимого словаря
tDict = tInput[0:k]
else:
tDict = tInput[k - nD:k]
tDict = tDict.rjust(nD, chr(0x02f3))
# символ пустого месте также - 0x02da
# определение содержимого буфера
tBuff = tInput[k:k + nB]
# получение сдвига курсора кода и его размера в битах
if tMethod == 'LZ77':
n, tCode, sizeCode = makeLZ77(tDict, math.ceil(math.log2(nD)), tBuff, math.ceil(math.log2(nB)))
print('| {0} | {1} | {2} |'.format(tDict.ljust(max(nD, 7)), \
tBuff.ljust(nB, chr(0x02da)).ljust(max(nB, 5)), tCode.ljust(3)))
f.write('| {0} | {1} | {2} |'.format(tDict.ljust(max(nD, 7)), \
tBuff.ljust(nB, chr(0x02da)).ljust(max(nB, 5)), tCode.ljust(3)))
tOutput += tCode
sizeOutput += sizeCode
k += n
# input()
print('=={0}==={1}==={2}=='.format(''.ljust(max(nD, 7), '='), ''.ljust(max(nB, 5), '='), ''.ljust(3, '=')))
f.write('=={0}==={1}==={2}==\n'.format(''.ljust(max(nD, 7), '='), ''.ljust(max(nB, 5), '='), ''.ljust(3, '=')))
f.close()
return tOutput, sizeOutput
def writeOutputText(fileName, tOutput, sizeOutput, nInput, nD):
print('\n сжатое (по методу {0}) сообщение - {1}'.format(tMethod, tOutput))
print('\n размер сжатого сообщения - {0} бит.'.format(sizeOutput))
print('коэффициент сжатия - {0}.'.format(sizeOutput / (sizeSymbol * nInput)))
with open(fileName, 'wt', encoding='utf-8') as f:
f.write('tMethod={0}\n'.format(tMethod))
f.write('tOutputText={0}\n'.format(tOutput))
f.write('nDict={0}\n'.format(nD))
f.write('\n размер сжатого сообщения - {} бит. \n'.format(sizeOutput))
f.write('коэффициент сжатия - {0}.'.format(sizeOutput / (sizeSymbol * nInput)))
return
# -*- Main -*-
# прочитаем исходное сообщение
tInputText, nDict, nBuff = readInputText('Lab2-1.txt')
# создадим сжатый текст
tOutputText, sizeOutputText = makeOutputText('Lab2-2.txt', tInputText, nDict, nBuff)
# сохраним сжатый текст
writeOutputText('Lab2-3.txt', tOutputText, sizeOutputText, len(tInputText), nDict)
请告诉我一个问题,您需要为此代码制作一个GUI(表单)。在自我执行的过程中,我遇到了很多无法做到的原因,因为我是第一次做这样的事情。
我附上代码:
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5 import uic
import os
import math
tMethod = 'LZ77'
sizeSymbol = 8
class App(QWidget):
def __init__(self):
self.start()
self.set()
self.str36(num36=0)
self.makeLZ77(d="", ld=0, b="", lb=0)
self.OutputText(nD=0, nB=0)
def start(self):
self.ui = uic.loadUi("GUI.ui")
self.ui.show()
self.ui.textEdit.setText('')
self.ui.textEdit_2.setText('')
self.ui.textEdit_3.setText('')
def set(self):
self.ui.pushButton.clicked.connect(lambda: self.readInputText())
def readInputText(self):
text_old = ''
imput = self.ui.textEdit.toPlainText()
# Введите последовательность:
text_old += '\n исходное сообщение - {0} = '+ imput
# размер словаря (сим, default=8)-
nD = self.ui.textEdit_2.toPlainText()
text_old += '\n размер словаря - {0} = '+ nD
# размер буфера (сим, default=5)-
nB = self.ui.textEdit_3.toPlainText()
text_old += '\n размер буфера - {0} сим. = '+ nB
self.ui.label_5.setText(text_old)
def str36(self,num36):
if (num36 >= 0) and (num36 <= 9):
strNum = str(num36)
elif (num36 >= 10) and (num36 <= 36):
strNum = chr(0x0041 + num36 - 10) # ord('A') = 0x0041
else:
strNum = 'Error'
return strNum
def makeLZ77(self,d, ld, b, lb):
i = d.find(b[0])
# первый символ буфера в словаре не найден или это последний символ буфера
if (i == -1) or (i == len(b) - 1):
i = 0 # смещение
n = 0 # длина подстроки
Code = self.str36(i) + self.str36(n) + b[n] # код lz77
# первый символ буфера в словаре найден смещение - i
else:
n = 0 # длина подстроки
while (n < len(d) - i) and (n < len(b)) and (b[n] == d[i + n]):
# if n <= len(b):
n += 1
Code = self.str36(i) + self.str36(n) + b[n] # код lz77
sizeCode = ld + lb + sizeSymbol # размер 1го lz77 кода в битах
# сдвиг курсора код и размер кода
return [n + 1, Code, sizeCode]
def OutputText(self, nD, nB):
self.ui.label_5.setText('\n' + 'метод {0}'.format(tMethod).center(max(nD, 7) + max(nB, 5) + 3 + 10))
self.ui.label_5.setText('=={0}==={1}==={2}=='.format(''.ljust(max(nD, 7), '=') + ''.ljust(max(nB, 5), '=') + ''.ljust(3, '=')))
self.ui.label_5.setText('| {0} | {1} | {2} |'.format('словарь'.center(max(nD, 7)) + 'буфер'.center(max(nB, 5)) + 'код'.center(3)))
self.ui.label_5.setText('|-{0}-|-{1}-|-{2}-|'.format(''.ljust(max(nD, 7), '-') + ''.ljust(max(nB, 5), '-') + ''.ljust(3, '-')))
if __name__ == '__main__':
app = QApplication(sys.argv)
main = App()
app.exec_()
我还附上了一张通过Qt Designer制作的GUI的照片
如果有了解这些问题的人,请告诉我,我将非常感谢有机会交流。
还有另一个可能的版本,但我也无法正确编译它,因为我收到错误:
import math
from main import App
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5 import uic
import sys
# константы
tMethod = 'LZ77'
sizeSymbol = 8 # размер 1го символа в битах
# функции
def readInputText(fileName):
listWidget = main.ui.listWidget
textEdit = main.ui.textEdit
textEdit_2 = main.ui.textEdit_2
textEdit_3 = main.ui.textEdit_3
tInput, nD, nB = '', 8, 5
try:
# пытаемся открыть файл на чтение
f = open(fileName, 'rt', encoding='utf-8')
except FutureWarning:
# файл не найден - запрашиваем параметры с консоли
tInput = textEdit.toPlainText()
try:
nD = textEdit_2.toPlainText()
except ValueError:
nD = 8
try:
nB = textEdit_3.toPlainText()
except ValueError:
nB = 5
else:
# файл найден чтаем параметры из файла
tInputLines = f.readlines()
f.close()
for tLine in tInputLines:
if tLine[0:11] == 'tInputText=':
tInput = tLine[11:].strip()
elif tLine[0:6] == 'nDict=':
try:
nD = int(tLine[6:].strip())
except ValueError:
nD = 8
elif tLine[0:6] == 'nBuff=':
try:
nB = int(tLine[6:].strip())
except ValueError:
nB = 8
finally:
# сохраняем параметры в файл
with open(fileName, 'wt', encoding='utf-8') as f:
f.write('tInputText={0}\n'.format(tInput))
f.write('nDict={0}\n'.format(nD))
f.write('nBuff={0}\n'.format(nB))
return tInput, nD, nB
# используем 36-ричную систему счисления для смещения и длины строки
def str36(num36):
if (num36 >= 0) and (num36 <= 9):
strNum = str(num36)
elif (num36 >= 10) and (num36 <= 36):
strNum = chr(0x0041 + num36 - 10) # ord('A') = 0x0041
else:
strNum = 'Error'
return strNum
##### вот здесь после else нужно добавить 3 строчки как сказал мой препод
def makeLZ77(d, ld, b, lb):
i = d.find(b[0])
# первый символ буфера в словаре не найден или это последний символ буфера
if (i == -1) or (i == len(b) - 1):
i = 0 # смещение
n = 0 # длина подстроки
Code = str36(i) + str36(n) + b[n] # код lz77
# первый символ буфера в словаре найден смещение - i
else:
n = 0 # длина подстроки
while (n < len(d) - i) and (n < len(b)) and (b[n] == d[i + n]):
# if n <= len(b):
n += 1
Code = str36(i) + str36(n) + b[n] # код lz77
sizeCode = ld + lb + sizeSymbol # размер 1го lz77 кода в битах
# сдвиг курсора код и размер кода
return [n + 1, Code, sizeCode]
#####
def makeOutputText(fileName, tInput, nD, nB):
print('\n' + 'метод {0}'.format(tMethod).center(max(nD, 7) + max(nB, 5) + 3 + 10))
print('=={0}==={1}==={2}=='.format(''.ljust(max(nD, 7), '='), ''.ljust(max(nB, 5), '='), ''.ljust(3, '=')))
print('| {0} | {1} | {2} |'.format('словарь'.center(max(nD, 7)), 'буфер'.center(max(nB, 5)), 'код'.center(3)))
print('|-{0}-|-{1}-|-{2}-|'.format(''.ljust(max(nD, 7), '-'), ''.ljust(max(nB, 5), '-'), ''.ljust(3, '-')))
f = open(fileName, 'wt', encoding='utf-8')
f.write('метод {0}'.format(tMethod).center(max(nD, 7) + max(nB, 5) + 3 + 10) + '\n')
f.write('=={0}==={1}==={2}==\n'.format(''.ljust(max(nD, 7), '='), ''.ljust(max(nB, 5), '='), ''.ljust(3, '=')))
f.write('| {0} | {1} | {2} |\n'.format('словарь'.center(max(nD, 7)), 'буфер'.center(max(nB, 5)), 'код'.center(3)))
f.write('|-{0}-|-{1}-|-{2}-|\n'.format(''.ljust(max(nD, 7), '-'), ''.ljust(max(nB, 5), '-'), ''.ljust(3, '-')))
nInput = len(tInput)
tOutput, sizeOutput = '', 0
k = 0
while k < nInput:
if k < nD: # определение содержимого словаря
tDict = tInput[0:k]
else:
tDict = tInput[k - nD:k]
tDict = tDict.rjust(nD, chr(0x02f3))
# символ пустого месте также - 0x02da
# определение содержимого буфера
tBuff = tInput[k:k + nB]
# получение сдвига курсора кода и его размера в битах
if tMethod == 'LZ77':
n, tCode, sizeCode = makeLZ77(tDict, math.ceil(math.log2(nD)), tBuff, math.ceil(math.log2(nB)))
print('| {0} | {1} | {2} |'.format(tDict.ljust(max(nD, 7)), \
tBuff.ljust(nB, chr(0x02da)).ljust(max(nB, 5)), tCode.ljust(3)))
f.write('| {0} | {1} | {2} |'.format(tDict.ljust(max(nD, 7)), \
tBuff.ljust(nB, chr(0x02da)).ljust(max(nB, 5)), tCode.ljust(3)))
tOutput += tCode
sizeOutput += sizeCode
k += n
# input()
print('=={0}==={1}==={2}=='.format(''.ljust(max(nD, 7), '='), ''.ljust(max(nB, 5), '='), ''.ljust(3, '=')))
f.write('=={0}==={1}==={2}==\n'.format(''.ljust(max(nD, 7), '='), ''.ljust(max(nB, 5), '='), ''.ljust(3, '=')))
f.close()
return tOutput, sizeOutput
def writeOutputText(fileName, tOutput, sizeOutput, nInput, nD):
print('\n сжатое (по методу {0}) сообщение - {1}'.format(tMethod, tOutput))
print('\n размер сжатого сообщения - {0} бит.'.format(sizeOutput))
print('коэффициент сжатия - {0}.'.format(sizeOutput / (sizeSymbol * nInput)))
with open(fileName, 'wt', encoding='utf-8') as f:
f.write('tMethod={0}\n'.format(tMethod))
f.write('tOutputText={0}\n'.format(tOutput))
f.write('nDict={0}\n'.format(nD))
f.write('\n размер сжатого сообщения - {} бит. \n'.format(sizeOutput))
f.write('коэффициент сжатия - {0}.'.format(sizeOutput / (sizeSymbol * nInput)))
return
# -*- Main -*-
if __name__ == '__main__':
app = QApplication(sys.argv)
main = App()
main.ui.pushButton.clicked.connect(readInputText)
app.exec_()
# прочитаем исходное сообщение
tInputText, nDict, nBuff = readInputText('Lab2-1.txt')
# создадим сжатый текст
tOutputText, sizeOutputText = makeOutputText('Lab2-2.txt', tInputText, nDict, nBuff)
# сохраним сжатый текст
writeOutputText('Lab2-3.txt', tOutputText, sizeOutputText, len(tInputText), nDict)