Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.01.2025, 12:50   #1
mikkijon
Пользователь
 
Регистрация: 03.10.2019
Сообщений: 28
По умолчанию Не заполняется таблица в БД

Приветствую Друзья!!!

Объясните пожалуйста мне, один нюанс в табличной модели. Я уже который день голову ломаю
Начну с самого начала вернувшись обратно к своей любимой теме, "Создание СУБД"..... Изучаю я по книге: Прохорёнок Н.А. Дронов В.А. - Python 3 и PyQt6 Разработка приложений.
там указан листинг:
Код:
from PyQt6 import QtCore, QtGui, QtWidgets, QtSql
import sys
def addRecord():
    if stm.value("category") == []:
        # Вставляем пустую запись, которую пользователь сможет ввести нужные данные
        stm.insertRecord(stm.rowCount())

def deleteRecord():
    # Удаляем запись из модели
    stm.removeRecord(tv.currentIndex().row())
    stm.select

app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QWidget()
window.setWindowTitle("Добавление и удаление записи")
# Устанавливаем соединение с базой данных
con = QtSql.QSqlDatabase.addDatabase("QSQLITE")
con.setDatabaseName("data.sqlite")
con.open()
# Создаем модель
stm = QtSql.QSqlTableModel(parent=window)
stm.setTable("category")
stm.sort(1, QtCore.Qt.SortOrder.AscendingOrder)
stm.select()
# Задает заголовки
stm.setHeaderData(0, QtCore.Qt.Orientation.Horizontal, "Номер записи")
stm.setHeaderData(1, QtCore.Qt.Orientation.Horizontal, "Категория")
vbox = QtWidgets.QVBoxLayout()
tv = QtWidgets.QTableView()
tv.setModel(stm)
tv.setColumnWidth(1, 60)
tv.setColumnWidth(2, 150)
vbox.addWidget(tv)
btnAdd = QtWidgets.QPushButton("&Добавить запись")
btnAdd.clicked.connect(addRecord)
vbox.addWidget(btnAdd)
btnDel = QtWidgets.QPushButton("&Удалить запись")
btnDel.clicked.connect(deleteRecord)
vbox.addWidget(btnDel)
window.setLayout(vbox)
window.resize(400, 250)
window.show()
sys.exit(app.exec())
Проблема в том, что если таблице нет записей то при нажатии на кнопке, "&Добавить запись", таблица не переходит в режим редактирования и вsходит сообщение:
Цитата:
Process finished with exit code -1073740791 (0xC0000409)
. И как не меняй функцию:
Цитата:
"addRecord"
if stm.value("category") == []:
# Вставляем пустую запись, которую пользователь сможет ввести нужные данные
stm.insertRecord(stm.rowCount())
или
if stm.Null == True:
# Вставляем пустую запись, которую пользователь сможет ввести нужные данные
stm.insertRecord(stm.rowCount())
все равно выходит сообщение:
Цитата:
Process finished with exit code -1073740791 (0xC0000409)
с Уважением Ким Евгений
mikkijon вне форума Ответить с цитированием
Старый 31.01.2025, 13:25   #2
DeepFlake
Форумчанин
 
Регистрация: 16.05.2024
Сообщений: 194
По умолчанию

Ранее вам уже давали совет как отлаживать программы на Python: надо смотреть сообщения от интерпретатора Python. Для этого надо либо запускать программу из командного окна графической оболочки, либо, если программа запускается из интегрированной среды, найти окно в среде, в которой выводятся сообщения об ошибках.

Так же в нахождении ошибки помогает отладочный вывод и использование отладчика pdb. pdb - это не отдельная программа, а в виде модуля к Python.
DeepFlake вне форума Ответить с цитированием
Старый 12.02.2025, 10:35   #3
ARTURK16
Новичок
Джуниор
 
Регистрация: 18.01.2025
Сообщений: 3
По умолчанию

попробуй так:
Код:
from PyQt6 import QtCore, QtWidgets, QtSql
import sys

def addRecord():
    # Создаем новую пустую запись с нужной структурой
    newRecord = stm.record()
    
    # Вставляем запись в конец модели
    if not stm.insertRecord(-1, newRecord):
        QtWidgets.QMessageBox.critical(None, "Ошибка", 
            f"Ошибка при добавлении записи: {stm.lastError().text()}")
    else:
        # Применяем изменения и обновляем отображение
        stm.submitAll()
        stm.select()

def deleteRecord():
    # Получаем текущий индекс выбранной строки
    index = tv.currentIndex()
    if not index.isValid():
        QtWidgets.QMessageBox.warning(None, "Предупреждение", 
            "Пожалуйста, выберите запись для удаления")
        return
    
    # Запрашиваем подтверждение удаления
    reply = QtWidgets.QMessageBox.question(None, "Подтверждение", 
        "Вы уверены, что хотите удалить эту запись?",
        QtWidgets.QMessageBox.StandardButton.Yes | 
        QtWidgets.QMessageBox.StandardButton.No)
    
    if reply == QtWidgets.QMessageBox.StandardButton.Yes:
        row = index.row()
        if not stm.removeRow(row):
            QtWidgets.QMessageBox.critical(None, "Ошибка", 
                f"Ошибка при удалении записи: {stm.lastError().text()}")
        else:
            stm.submitAll()
            stm.select()

# Инициализация приложения
app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QWidget()
window.setWindowTitle("Управление категориями")

# Устанавливаем соединение с базой данных
con = QtSql.QSqlDatabase.addDatabase("QSQLITE")
con.setDatabaseName("data.sqlite")
if not con.open():
    QtWidgets.QMessageBox.critical(None, "Ошибка базы данных", 
        f"Невозможно открыть базу данных: {con.lastError().text()}")
    sys.exit(1)

# Создаем и настраиваем модель
stm = QtSql.QSqlTableModel(parent=window)
stm.setTable("category")
stm.setEditStrategy(QtSql.QSqlTableModel.EditStrategy.OnFieldChange)
stm.sort(1, QtCore.Qt.SortOrder.AscendingOrder)

# Проверяем успешность загрузки данных
if not stm.select():
    QtWidgets.QMessageBox.critical(None, "Ошибка данных", 
        f"Ошибка загрузки данных: {stm.lastError().text()}")
    sys.exit(1)

# Задаем заголовки колонок
stm.setHeaderData(0, QtCore.Qt.Orientation.Horizontal, "Номер записи")
stm.setHeaderData(1, QtCore.Qt.Orientation.Horizontal, "Категория")

# Создаем и настраиваем интерфейс
vbox = QtWidgets.QVBoxLayout()

# Создаем представление таблицы
tv = QtWidgets.QTableView()
tv.setModel(stm)
tv.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.SingleSelection)
tv.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows)
tv.setColumnWidth(0, 100)
tv.setColumnWidth(1, 200)
vbox.addWidget(tv)

# Создаем панель с кнопками
buttonLayout = QtWidgets.QHBoxLayout()

btnAdd = QtWidgets.QPushButton("&Добавить запись")
btnAdd.clicked.connect(addRecord)
buttonLayout.addWidget(btnAdd)

btnDel = QtWidgets.QPushButton("&Удалить запись")
btnDel.clicked.connect(deleteRecord)
buttonLayout.addWidget(btnDel)

vbox.addLayout(buttonLayout)

# Настраиваем и отображаем окно
window.setLayout(vbox)
window.resize(400, 300)
window.show()

sys.exit(app.exec())
ARTURK16 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не заполняется таблица MYSQL Sergey_gorobets PHP 5 08.07.2015 13:46
Не заполняется таблица n-sia PHP 1 17.04.2012 23:32
Не заполняется дочерняя таблица Lapa1 БД в Delphi 0 21.01.2012 01:56
бд заполняется через раз boshki Помощь студентам 2 25.05.2011 15:13
dataGridView1 не заполняется. sergei64_89 Общие вопросы .NET 3 19.09.2008 11:13