Python - GUI PyQt5 реализация для кода
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_()
Так же прилагаю фото моего GUI делал через Qt Designer
Если есть кто сведущий в данных вопросах, прошу подсказать, буду очень благодарен так же за возможность пообщаться.
Есть еще одна возможная версия но тоже не могу ее скомпилировать правильно так как ошибки:
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)
Ответы (1 шт):
Я взял к рассмотрению вашу первую попытку сделать GUI (вторую вашу попытку и логику кода я не рассматривал).
Позволю вам дать некоторые советы:
Вы выбрали виджет основного окна
QWidget, поэтому и создании формы вQt Designerнадо выбиратьQWidget, а неQDialog.один из способов встраивания формы, которая содержит дизайн вашего приложения выглядит так:
uic.loadUi('q1198208.ui', self)для ввода строковых данных больше всего подходит виджет
QLineEditдля ввода целочисленных данных больше всего подходит виджет
QSpinBoxпрежде чем запускать какие-либо расчеты, необходимо максимально возможно проверять входные данные. Например так:
self.text_word = self.lineEdit.text() if not self.text_word: msg = QtWidgets.QMessageBox.information(self, 'Message', 'Введите Кодируемое слово.') returnчтобы выводимый результат имел правильный формат, вам надо использовать шрифт
"Consolas"
А также не забывайте предоставлять все модули, которые необходимы для воспроизведения
вашей проблымы. Модули .ui также надо публиковать.
Не надо предоставлять несколько вариантов ваших попыток, сосредоточтесь на одной, которая по вашему мнению самая перспективная.
main.py
import sys
import os
import math
from PyQt5 import QtWidgets, QtCore, QtGui, uic
from PyQt5.QtWidgets import QApplication, QWidget
#tMethod = 'LZ77'
#sizeSymbol = 8
class Window(QWidget):
def __init__(self):
super(Window, self).__init__()
#Загрузить страницу пользовательского интерфейса
uic.loadUi('q1198208.ui', self) # !!!
self.tMethod = 'LZ77' # +
self.sizeSymbol = 8 # +
self.text_word = ''
self.size_dict = 0
self.size_buffer = 0
self.pushButton.clicked.connect(self.readInputText) # !
# !!! Это ВАЖНО !! vvvvvvvv !!! "Consolas" !!!!!!!!!!!!!!!!!!!!
font = QtGui.QFont("Consolas", 10, QtGui.QFont.Bold)
self.plainTextEdit.setFont(font) # установить шрифт ТОЛЬКО для plainTextEdit
self.plainTextEdit.setReadOnly(True)
# ???
def str36(self, num36=0):
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'
msg = QtWidgets.QMessageBox.information(self, 'Message', 'strNum = "Error".')
return strNum # ???
def readInputText(self):
self.text_word = self.lineEdit.text()
self.size_dict = self.spinBox.value()
self.size_buffer = self.spinBox_2.value()
if not self.text_word:
msg = QtWidgets.QMessageBox.information(self, 'Message', 'Введите Кодируемое слово.')
return
if not self.size_dict:
msg = QtWidgets.QMessageBox.information(self, 'Message', 'Введите Размер словаря.')
return
if not self.size_buffer:
msg = QtWidgets.QMessageBox.information(self, 'Message', 'Введите Размер буфера.')
return
# self.makeLZ77(d="", ld=0, b="", lb=0)
self.outputText(nD=0, nB=0)
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 + self.sizeSymbol # размер 1го lz77 кода в битах
# сдвиг курсора код и размер кода
return [n + 1, Code, sizeCode]
def outputText(self, nD=0, nB=0):
self.plainTextEdit.clear()
self.plainTextEdit.appendPlainText(
'метод {0}'.format(self.tMethod).center(max(nD, 7) + max(nB, 5) + 3 + 10)
)
self.plainTextEdit.appendPlainText(
'=={0}==={1}==={2}=='.format(
''.ljust(max(nD, 7), '='), # + \
''.ljust(max(nB, 5), '='), # + \
''.ljust(3, '=')
)
)
self.plainTextEdit.appendPlainText(
'| {0} | {1} | {2} |'.format(
'словарь'.center(max(nD, 7)),
'буфер'.center(max(nB, 5)),
'код'.center(3))
)
self.plainTextEdit.appendPlainText(
'|-{0}-|-{1}-|-{2}-|'.format(
''.ljust(max(nD, 7), '-'),
''.ljust(max(nB, 5), '-'),
''.ljust(3, '-'))
)
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setFont(QtGui.QFont("Times", 10, QtGui.QFont.Bold))
w = Window()
w.show()
sys.exit(app.exec_())
q1198208.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="Form">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>520</width>
<height>407</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="font">
<font>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Решение</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QPlainTextEdit" name="plainTextEdit"/>
</item>
<item row="2" column="0">
<widget class="QFrame" name="frame">
<property name="minimumSize">
<size>
<width>400</width>
<height>120</height>
</size>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Кодируемое слово</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="lineEdit"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Размер словаря</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="spinBox"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Размер буфера</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="spinBox_2"/>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QPushButton" name="pushButton">
<property name="text">
<string>Зашифровать</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

