import sys
import vvod_tabl
import tabl,korvv
from PyQt5 import QtCore, QtGui, QtWidgets,QtSql
import sqlite3
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QStandardItemModel, QStandardItem
from PyQt5.QtWidgets import QApplication, QGridLayout, QWidget,QTableWidget, QTableWidgetItem, QComboBox
class TwoWindow(QtWidgets.QMainWindow,vvod_tabl.Ui_MainWindow):
def __init__(self):
super().__init__()
#методом super() мы явно вызываем родительский конструктор.
self.setupUi(self)# Это нужно для инициализации нашего дизайна
self.btn_dob_vv.clicked.connect(self.dob_str)
self.comboBox.addItems(["Доход", "Расход"])
self.comboBox.activated[str].connect(self.onActivated)
self.tablevv.setHorizontalHeaderLabels(["ID", "Наименование", "Статья дохода/расхода", "Сумма"])
self.tablevv.setColumnWidth(0, 25); self.tablevv.setColumnWidth(1, 240)# задание ширины столбцов
self.tablevv.setColumnWidth(2, 200); self.tablevv.setColumnWidth(3, 100)
self.tablevv.cellClicked.connect(self.cell_clicked) #корректирование ячейки
TwoWindow.mat=[] #объявление массива для занесения из временной таблицы в
#в основную таблицу
def onActivated(self, text): #используется в combobox для получения значения в Edit
self.Edit_dox.setText(text)
def dob_str(self):
global kolstr
entry_descriptionz=self.entry_description.text() #определение полей для таблицы
totalz=float(self.Edit_sum.text());costsz=self.Edit_dox.text()
#Вставка строки с данными из формы во временную таблицу
rowPosition =self.tablevv.rowCount()
self.tablevv.insertRow(rowPosition) #добавляем пустую строку
new=rowPosition;idz=new+1;kolstr=new+1
self.tablevv.setItem(new, 0, QTableWidgetItem(str(idz)))
self.tablevv.setItem(new, 1, QTableWidgetItem(entry_descriptionz))
self.tablevv.setItem(new, 2, QTableWidgetItem(costsz))
self.tablevv.setItem(new, 3, QTableWidgetItem(str(totalz)))
TwoWindow.mat.append([])#Добавление пустой строки в список из одного элемента
#Далее вводятся значения полей тавлицы в строку матрицы:
TwoWindow.mat[new].append(str(idz));TwoWindow.mat[new].append(entry_descriptionz)
TwoWindow.mat[new].append(costsz);TwoWindow.mat[new].append(str(totalz))
def cell_clicked(self): #определение номера столбца и строки для ячейки
row = self.tablevv.currentItem().row()
col = self.tablevv.currentItem().column()
idz = int(self.tablevv.item(row,0).text())
descriptionz= self.tablevv.item(row,1).text()
costsz= self.tablevv.item(row,2).text()
totalz= self.tablevv.item(row,3).text()
#================================================================================
class GL_Window(QtWidgets.QMainWindow, tabl.Ui_MainWindow):
def __init__(self):
#сайты по tablewidget
# https://python-scripts.com/pyqt5
#https://evileg.com/ru/post/236/
# Это здесь нужно для доступа к переменным, методам
# и т.д. в файле tabl.py
super().__init__()
self.setupUi(self)# Это нужно для инициализации нашего дизайна для класса
self.viv_records()
def viv_records(self): #Ввод в таблицу данных из базы
global query
self.setupUi(self)# Это нужно для инициализации нашего дизайна tabl.ui
con=QtSql.QSqlDatabase.addDatabase('QSQLITE') #тип базы данных и создание соединения
con.setDatabaseName('data.sqlite') #вызов таблицы из базы
con.open() #открытие соединения
query=QtSql.QSqlQuery()
query.exec("select * from finance")
if query.isActive(): #если активно соединение
query.first();i=0 # к началу таблицы finance
while query.isValid():
# заполняем i-ю строку:
self.table.setRowCount(i)#задаем количество строк в таблице
self.table.insertRow(i) #Вставка строки после i-ой строки
self.table.setItem(i, 0, QTableWidgetItem(str(query.value('id'))))
self.table.setItem(i, 1, QTableWidgetItem(query.value('description')))
self.table.setItem(i, 2, QTableWidgetItem(query.value('costs')))
self.table.setItem(i, 3, QTableWidgetItem(str(query.value('total'))))
i=i+1;query.next()#следующая запись
self.btn_dob.clicked.connect(self.dob_str_form)
self.btn_del.clicked.connect(self.del_str)#удаление строки
self.btn_head2.clicked.connect(self.sort_naim_tabl)#сортировка по наименованию в таблице
self.btn_head4.clicked.connect(self.sort_total_tabl)#сортировка по сумме в таблице
self.btn_0_insert_tab.clicked.connect(self.insert_0_str_tabl)#вставка пустой строки в таблицу
self.btn_insert_tabl.clicked.connect(self.vst_tabl_iz_form)#Вставка данных из временной таблицы в основную
self.btn_edit.clicked.connect(self.korzap)#Создание экземпляра класса для корректировки строки
self.btn_iz_vv.clicked.connect(self.izmenstr)#Вставка измененной строки в таблицу
self.btn_zan_base.clicked.connect(self.zan_base)#Занесение таблицы в базу
self.btn_iz_base.clicked.connect(self.viv_records) #Занесение данных из базы в таблицу
self.table.setHorizontalHeaderLabels(["ID", "", "Статья дохода/расхода", "Сумма"])#Наименование столбцов
self.table.setColumnWidth(0, 25); self.table.setColumnWidth(1, 240)# задание ширины столбцов
self.table.setColumnWidth(2, 200); self.table.setColumnWidth(3, 100)
self.table.cellClicked.connect(self.cell_clicked) #корректирование ячейки
def cell_clicked(self): #определение номера столбца и строки для ячейки
global costsz,totalz,descriptionz,row,col
row = self.table.currentItem().row() #Номер строки корректируемой ячейки
col = self.table.currentItem().column() #Номер столбца корректируемой ячейки
idz = int(self.table.item(row,0).text()) #Запоминание значений полей
descriptionz= self.table.item(row,1).text() #корректируемой строки
costsz= self.table.item(row,2).text()
totalz= self.table.item(row,3).text()
def insert_0_str_tabl(self): #вставка пустой строки в таблицу table
rowPosition = self.table.rowCount()#Определение количества строк в таблице
self.table.insertRow(rowPosition)#Вставка строки
new=rowPosition #Далее заполняем строку
self.table.setItem(new, 0, QTableWidgetItem(' ')) # не менее 3-х пробелов
self.table.setItem(new, 1, QTableWidgetItem(' ')) # для каждого столбца
self.table.setItem(new, 2, QTableWidgetItem(' '))
self.table.setItem(new, 3, QTableWidgetItem(' '))
def del_str(self):#Удаление строки из таблицы
row = self.table.currentItem().row()#определение номера удаляемой строки
self.table.removeRow(row) #Удаление строки
def dob_str_form(self):#создание экземпляра класса для добавления новой строки
self.twoWindow = TwoWindow() #с помощью формы во временную таблицу
self.twoWindow.show()
def vst_tabl_iz_form(self):# вставка данных из временной таблицы ввода в основную таблицу
rowPosition = self.table.rowCount()
idz=0
r=rowPosition #Кол-во строк в таблице
for i in range(kolstr): #цикл по кол-ву строк во временной таблице (kolstr)
self.table.insertRow(r) #Вставка строки
self.table.setItem(r,0, QTableWidgetItem(str(idz)))# вставка индекса основной таблицы
for j in range(1,4):
#Далее занесение значений строки матрицы TwoWindow.mat в поля таблицы table:
self.table.setItem(r,j, QTableWidgetItem(TwoWindow.mat[i][j]))
r=r+1;idz=idz+1#Увеличение номера строки основной таблицы и ее индекса
def sort_naim_tabl(self):#сортировка по наименованию в таблице
self.table.sortByColumn(
1, QtCore.Qt.AscendingOrder)
def sort_total_tabl(self):#сортировка по сумме в таблице
self.table.sortByColumn(
3, QtCore.Qt.AscendingOrder)
def korzap(self):
self.kor=Korzap()#Создание экземпляра класса для корректировки строки
self.kor.show() #вывод на экран экземпляра
def izmenstr(self):#Вставка данных измененной строки в форме в таблицу
self.table.setItem(row, 1, QTableWidgetItem(descriptionz))
self.table.setItem(row, 2, QTableWidgetItem(costsz))
self.table.setItem(row, 3, QTableWidgetItem(str(totalz)))
def zan_base(self):#Занесение данных из таблицы в базу
if query.isActive():#если база активна
query.exec(" DELETE FROM finance")#очищение базы
kolstr = self.table.rowCount()#определение кол-ва строк в таблице
for i in range(0,kolstr):
descriptionz=self.table.item(i,1).text()#Занесение данных из таблицы в переменные
costsz= self.table.item(i,2).text()
totalz=float(self.table.item(i,3).text())
query.prepare("insert into finance values(null,:description,:costs,:total)")
query.bindValue(':description',descriptionz)#вставка значений переменных в поля базы
query.bindValue(':costs',costsz)
query.bindValue(':total',totalz)
query.exec_()#Выполнение операций
query.next()#следующая запись
#===================================================================
class Korzap(QtWidgets.QDialog,korvv.Ui_Form):
def __init__(self):
# Это здесь нужно для доступа к переменным, методам
super().__init__()
self.setupUi(self)
self.des.setText(descriptionz) #испльзуем переменные, полученные в cell_clicked
self.comboBox.addItems(["Доход", "Расход"])
self.comboBox.activated[str].connect(self.onActivated)
self.dox.setText(costsz);
self.tot.setText(totalz);
self.btn_edit.clicked.connect(self.izmen)#вызов функции для запоминания измененных данных
def onActivated(self, text): #используется в combobox для получения значения в Edit
self.dox.setText(text)
def izmen(self):
global costsz,totalz,descriptionz
descriptionz=self.des.text(); costsz=self.dox.text()
totalz=self.tot.text()#Запоминание измененных данных
def main():
app = QtWidgets.QApplication(sys.argv)# Новый экземпляр QApplication
#Этот шаг необходим для PyQt5;
#каждое приложение пользовательского интерфейса должно создавать
#экземпляр QApplication в качестве своего рода точки входа в приложение.
w = GL_Window();w.setWindowtitle('Расчет финансов')#создаем экземпляр класса
w.show()# Показываем окно
sys.exit(app.exec_()) # и запускаем приложени
#exec запускает цикл обработки сообщений и ждет, пока
#не будет вызвана exit() или не будет разрушен главный виджет,
#и возвращает значение, установленное в exit()
#Здесь sys.ext обеспечивает чистый выход из приложения
if __name__ == "__main__":
main()
|