При нажатии на одну из кнопок программа, написанная на PyQt5, вылетает с exit code 1
Я пыталась переписывать функции уже много раз, ничего не работает. Программа должна сверять два .txt файла, при проверке работы функций в Jupyter все работает, но когда добавляю функции в программу, она не дает сверить файлы. Вот сама программа:
import os
from PyQt5.QtWidgets import *
from PyQt5 import QtGui
import pandas as pd
app = QApplication([])
win = QWidget()
win.resize(1000, 600)
win.setWindowTitle('Приложение для проветки счетов ИНКАХРАН')
btn_dir_cft = QPushButton("Папка с файлами ЦФТ")
btn_dir_cft.setFont(QtGui.QFont("Times", 12, QtGui.QFont.Bold))
btn_dir_cft.adjustSize()
lw_files_cft = QListWidget()
btn_dir_incas = QPushButton("Папка с файлами ИНКАХРАН")
btn_dir_incas.setFont(QtGui.QFont("Times", 12, QtGui.QFont.Bold))
btn_dir_incas.adjustSize()
lw_files_incas = QListWidget()
btn_instruction = QPushButton("Инструкция")
btn_instruction.setFont(QtGui.QFont("Times", 12, QtGui.QFont.Bold))
btn_instruction.adjustSize()
btn_check = QPushButton("Сверить")
btn_check.setFont(QtGui.QFont("Times", 12, QtGui.QFont.Bold))
btn_check.adjustSize()
main_col = QVBoxLayout()
row1 = QHBoxLayout()
row2 = QHBoxLayout()
row1.addWidget(btn_dir_cft)
row2.addWidget(lw_files_cft)
row1.addWidget(btn_dir_incas)
row2.addWidget(lw_files_incas)
main_col.addWidget(btn_instruction)
main_col.addLayout(row1, 20)
main_col.addLayout(row2, 20)
main_col.addWidget(btn_check)
win.setLayout(main_col)
win.show()
def popup():
instruction = QMessageBox()
instruction.setWindowTitle('Инструкция по использованию приложения')
instruction.setText('''Для работы с программой у Вас на компьютере должны быть следующие файлы:
1) пины-тарифы.txt
2) проводка из цфт за месяц (название любое). Проводку также сохранять с кодировкой UTF-8.
3) файл текстовый, который прислал ИНКАХРАН (название любое)
Для того, чтобы сделать последний файл нужно зайти в файл Excel, нажать "Сохранить как" и сохранить в формате TXT.
Затем зайти в блокнот, нажать "Файл -> Сохранить как..." и в окне "Кодировка" выбрать UTF-8. (Это очень важно).
Далее, воспользовавшись кнопками выбора папок, необходимо выбрать папки,
где у Вас лежат файлы из ЦФТ и созданные текстовые файл сверок.
Из получившихся списков двойным щелчком выбрать нужные файлы и нажать кнопку "Сверить".
Если Вы сделали все по инструкции, у Вас должен получиться файл "ПИНы - комиссии итог.txt" в папке,
где лежат проводки из ЦФТ за месяц.''')
instruction.setFont(QtGui.QFont("Times", 12))
instruction.setIcon(QMessageBox.Information)
instruction.setStandardButtons(QMessageBox.Ok)
instruction.resize(100, 100)
instruction.exec_()
workdir_cft = ''
def filter_cft(files, extensions):
result_cft = []
for filename in files:
for ext in extensions:
if filename.endswith(ext):
result_cft.append(filename)
return result_cft
def chooseWorkdir_cft():
global workdir_cft
workdir_cft = QFileDialog.getExistingDirectory()
def showFilenamesList_cft():
extensions = ['.txt']
chooseWorkdir_cft()
filenames = filter_cft(os.listdir(workdir_cft), extensions)
lw_files_cft.clear()
for filename in filenames:
lw_files_cft.addItem(filename)
workdir_incas = ''
def filter_incas(files, extensions):
result_incas = []
for filename in files:
for ext in extensions:
if filename.endswith(ext):
result_incas.append(filename)
return result_incas
def chooseWorkdir_incas():
global workdir_incas
workdir_incas = QFileDialog.getExistingDirectory()
def showFilenamesList_incas():
extensions = ['.xlsx']
chooseWorkdir_incas()
filenames = filter_incas(os.listdir(workdir_incas), extensions)
lw_files_incas.clear()
for filename in filenames:
lw_files_incas.addItem(filename)
name_cft = ''
def event_cft(item_cft):
global name_cft
name_cft = item_cft.text()
return name_cft
name_incas = ''
def event_incas(item_incas):
global name_incas
name_incas = item_incas.text()
return name_incas
def making_list_cft():
with open(workdir_cft.replace('/', '\\') + '\\' + name_cft, 'r', encoding='utf-8') as file:
table = file.read()
dict_table = {}
table = table.split('\n')
split_table = []
col = []
for line in table:
line = line.split('\t')
split_table.append(line)
for i in range(len(split_table[0])):
for j in range(1, len(split_table)):
col.append(split_table[j][i])
dict_table[split_table[0][i]] = col
col = []
dict_table['ПИН'] = dict_table['Назначение платежа']
items_to_delete = ['Счет Дебет', 'Счет Кредит', 'Состояние', 'Получатель', 'Компания', 'Документ',
'Назначение платежа']
for item in items_to_delete:
dict_table.pop(item)
PIN = []
for each in dict_table['ПИН']:
each = each.split(' ЗАЯВЛЕНО')
PIN.append(each[0])
dict_table['ПИН'] = PIN
summa = []
for each in dict_table['Сумма']:
each = each.replace(',', '.')
summa.append(each)
dict_table['Сумма'] = summa
with open(workdir_cft.replace('/', '\\') + '\\' + 'пин-тариф.txt', 'r', encoding='utf-8') as file:
rates = file.read()
rates = rates.split('\n')
PIN = []
for line in rates:
line = line.split('\t')
PIN.append(line)
rates = {}
PIN = PIN[1::]
row = []
rates['ПИН'] = ['Инкассация %', 'Инкассация мин', 'Пересчет %', 'Пересчет мин', 'НДС']
for i in range(len(PIN)):
for j in range(1, len(PIN[0])):
row.append(PIN[i][j])
rates[PIN[i][0]] = row
row = []
commission = {}
for i in range(len(dict_table['ПИН'])):
if dict_table['ПИН'][i] in rates.keys():
if rates[dict_table['ПИН'][i]][0] == '0.00':
commission[dict_table['ПИН'][i]] = float(rates[dict_table['ПИН'][i]][1]) * 1.2
else:
if float(dict_table['Сумма'][i]) * float(rates[dict_table['ПИН'][i]][0]) * 1.2 < float(
rates['ПИН'][i][1]):
commission[dict_table['ПИН'][i]] = float(rates[dict_table['ПИН'][i]][1]) * 1.2
else:
commission[dict_table['ПИН'][i]] = float(dict_table['Сумма'][i]) * float(
rates[dict_table['ПИН'][i]][0]) * 1.2
if rates[dict_table['ПИН'][i]][2] == '0.00':
commission[dict_table['ПИН'][i]] += float(rates[dict_table['ПИН'][i]][3])
else:
if float(dict_table['Сумма'][i]) * float(rates[dict_table['ПИН'][i]][2]) < float(rates['ПИН'][i][3]):
commission[dict_table['ПИН'][i]] += float(rates[dict_table['ПИН'][i]][3])
else:
commission[dict_table['ПИН'][i]] += float(dict_table['Сумма'][i]) * float(
rates[dict_table['ПИН'][i]][2])
for key in commission:
commission[key] = round(commission[key], 3)
with open(workdir_cft.replace('/', '\\') + '\\пины-комиссии из ЦФТ.txt', 'w', encoding='utf-8') as file:
for key in commission:
file.write(str(key) + '\t' + str(commission[key]) + '\n')
def making_list_tables():
xl = pd.ExcelFile(workdir_incas.replace('/', '\\') + '\\' + name_incas)
frames = []
for name in xl.sheet_names:
df = xl.parse(name).drop([0])
frames.append(df)
PINs = []
commissions = []
all_final = []
itog = {}
for frame in frames:
for element in frame['Unnamed: 2']:
PINs.append(element)
for element in frame['Unnamed: 14']:
commissions.append(element)
all_PINs = list(set(PINs))[1::]
final = {}
for each in all_PINs:
final[each] = 0
for each in final:
for i in range(len(PINs)):
if each == PINs[i]:
final[each] += commissions[i]
all_final.append(final)
for each in all_PINs:
itog[each] = 0
for PIN in all_PINs:
for each in all_final:
if PIN in each.keys():
itog[PIN] += each[PIN]
with open(workdir_incas + '\\пины-комиссии из сверок.txt', 'w', encoding="utf-8") as file:
for key in itog:
file.write(str(key) + '\t' + str(itog[key]) + '\n')
def errors():
making_list_cft()
making_list_tables()
with open(workdir_incas.replace('/', '\\') + '\\пины-комиссии из сверок.txt', 'r', encoding="utf-8") as file:
sverki = file.read()
with open(workdir_cft.replace('/', '\\') + '\\пины-комиссии из ЦФТ.txt', 'r', encoding="utf-8") as file:
cft = file.read()
sverki = sverki.split('\n')[0:-1]
cft = cft.split('\n')[0:-1]
sverki_dict = {}
cft_dict = {}
error = {}
for line in sverki:
line = line.split('\t')
sverki_dict[line[0]] = line[1]
for line in cft:
line = line.split('\t')
cft_dict[line[0]] = round(float(line[1]), 1)
for key in sverki_dict.keys():
if sverki_dict[key] != cft_dict[key]:
error[key] = 'неправильное: ' + str(sverki_dict[key]) + ' | правильное: ' + str(cft_dict[key])
with open(workdir_cft.replace('/','\\') + '\\ошибки.txt', 'w', encoding="utf-8") as file:
for key in error:
file.write(str(key) + '\t' + str(error[key]) + '\n')
lw_files_cft.itemDoubleClicked.connect(event_cft)
lw_files_incas.itemDoubleClicked.connect(event_incas)
btn_dir_incas.clicked.connect(showFilenamesList_incas)
btn_dir_cft.clicked.connect(showFilenamesList_cft)
btn_instruction.clicked.connect(popup)
btn_check.clicked.connect(errors)
app.exec()