кинотеатр Победа Лучшая поза в постели мечеть

piknad@yandex.ru

Начинающим

изучать Python

Город Уфа

мост ч/з Белую

Яндекс.Погода

Салават Юлаев Монумент Дружбы
СОДЕРЖАНИЕ

На главную страницу сайта

Установка PYTHON 3.8

Установка PyQT5 с DESIGNER в PYTON 3.8

Установка Dgango 3.0 в Windows 7. Решение проблем

Создание таблицы tablewidget; редактирование,сортировка данных в таблице в Phyton 3.81 Tkinter

Создание таблицы; редактирование,сортировка данных,вставка и удаление строк в таблице в Phyton 3.81 PyQt5. Использование Designer.

Модели в Питон 3, Python 3, PyQt5

Примеры перевода программ с Delphi в Python

Создание сайта (блога) в Pycharm

Получение кэшбэка

ПИТОН 3 ДЛЯ НАЧИНАЮЩИХ. РАБОТА С QTABLEWIDGET В PyQt5. РЕДАКТИРОВАНИЕ ПОЛЕЙ, ВСТАВКА, УДАЛЕНИЕ, РЕДАКТИРОВАНИЕ ЯЧЕЕК. ИСПОЛЬЗОВАНИЕ DESIGNER.

Использование Designer для разработки кода

1 2 3 4 5 6

Редактирование таблицы tablewidget

Можно редактировать данные в ячейке, но бывает удобнее редактировать в форме. Для этого с помощью Designer мы создадим еще класс (Рис.23)

создание класса с помощью Desinger

Рис.23 Создание класса для корректировки строки.

создание класса формы с помощью designer

Рис.24 Форма для корректировки строки

Занесем аналогично вводу на форму кнопки, метки и combobox. "Наименование"- label,"Доход/расход"-label_2, "Сумма"- label_3, окно для ввода наименования-des, окно для вида операции-dox, Окно для ввода суммы- tot, comboBox-comboBox. После записи формы получим файл korvv.ui.

Создадим файл конвертации conv_korvv.bat-_ pyuic5 korvv.ui -o korvv.py

Ниже приводится текст класса для корректировки полей таблицы(рис. 25):

корректировка полей таблицы tablewidget

Рис. 25. Класс для корректировки полей таблицы tablewidget в форме.

Особенностью данного класса является то, что используется функция izmen для запоминания измененных переменных в окнах. Также при создании используется Widget ()рис. 23)

Сортировка по наименованию и сумме в tablewidget

Для этого используются кнопки на таблице (рис.21).с именами btn_head2 и btn_head2. Текст функций приводится ниже (рис.26):

сортировка полей в tablewidget

Рис. 26 Сортировка полей в tablewidget (1 и 3-ий столбец)

Полный текстпрограммы приводится ниже:

текст программы работы с tablewidgetтекст программы работы с tablewidgetтекст программы работы с Tablewidgetтекст программы работы в tablewidgetтекст программы работы в Tablewidget

Рис. 27. Текст программы работы с tablewidget

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()

Рис. 28. Текст программы для копирования (без пробелов)

 

1 2 3 4 5 6

Загрузка...