Котаны, приветствую!
Спешу сообщить, что Лаборатория свободных технологих объявляет о старте нового проекта с кодовым названием “Project T”. Он будет использовать таблицы для хранения данных. Как только будет готова первая версия, прикручу SQLite-базу. Исходный код будет открыт. Лицензия GPLv2. Для оффтопика буду распространять в виде exe-файла полноценной программы. Так что все смогут принять участие в её тестировании. Так же я должен буду изучить способы автотетирования с использованием Python’а, на этом проекте. Программу буду использовать в своём сервисе. Так же она послужит портфолио, если буду устраиваться на работу на дядю тестировщиком или кодером, если клюентов у моего сервиса не будет. Потом подумаем вместе, какое название ей придумать с использованием буквы ё - это обязательно.
Есть ли понятие класса в Python’e? Мне сразу проектировать его как ООП или в скриптовом языке это невозможно?

# ====================================================================== # main.py - Главный файл программы. # Является частью программы Project T, распространяемой под # Стандартной общественной лицензией, версии 2 (GNU GPL v2). # ====================================================================== # Copyleft 2026 by Lab Free Technologies <[email protected]> # ============================================================================== # Copyleft 2026 Лаборатория свободных технологий <[email protected]> # ============================================================================== # # from PyQt6 import QtWidgets, QtCore from PyQt6.QtCore import QCoreApplication from PyQt6.QtCore import QDate from PyQt6.QtCore import QTime from PyQt6.QtWidgets import QApplication from PyQt6.QtWidgets import QDateEdit from PyQt6.QtWidgets import QTimeEdit from PyQt6.QtWidgets import QMainWindow from PyQt6.QtWidgets import QWidget from PyQt6.QtWidgets import QTableWidgetItem import sys, os, time, mainwindow_ui, TAboutProgram_ui app = QApplication(sys.argv) class uiAbout (QWidget, TAboutProgram_ui.Ui_TAboutProgram): def __init__(self): QWidget.__init__(self) self.setupUi(self); wAbout = uiAbout() class uiMain (QMainWindow, mainwindow_ui.Ui_MainWindow): def __init__(self): QMainWindow.__init__(self) self.setupUi(self); def slotQuit(self): QCoreApplication.exit() def slotAbout(self): wAbout.show() def slotSave(self): arr = [],[] iHours = 0 iTotal = 1 with open("table.txt", "wt") as fTable: for i in range(self.tableWidget.rowCount()): arr[iHours].append(self.tableWidget.item(i,iHours).text()) print(arr[iHours][i]) print(arr[iHours][i], file = fTable) for i in range(self.tableWidget.rowCount()): arr[iTotal].append(self.tableWidget.item(i,iTotal).text()) print(arr[iTotal][i]) print(arr[iTotal][i], file = fTable) def slotOpen(self): arr = [],[] iHours = 0 iTotal = 1 vFile = None with open("table.txt", "rt") as fTable: for i in range(self.tableWidget.rowCount()): arr[iHours].append(fTable.readline()) self.tableWidget.item(i,iHours).setText(arr[iHours][i].strip()) #print(arr[iHours][i]) for i in range(self.tableWidget.rowCount()): arr[iTotal].append(fTable.readline()) self.tableWidget.item(i,iTotal).setText(arr[iTotal][i].strip()) #print(arr[iTotal][i]) def slotCellChanged(self, i, j): iCostHours = int(self.leCostHours.text()) iTotal = 1 s = self.tableWidget.item(i, j).text() if s.isdigit() == True: if int(s) > 15: s = str(15) self.tableWidget.item(i, j).setText(s) s = str(int(s) * iCostHours) print(s) print(i) print(iTotal) print(j) #self.tableWidget.item(i, j).setText(s)#эта строка вызыывет сегфолт :( else: self.tableWidget.item(i, j).setText("") def slotCellClicked(self, i, j): iHours = 0 iTotal = 1 if j == iTotal: self.tableWidget.setCurrentCell(i, iHours) wMain = uiMain() wMain.show() wMain.tableWidget.resizeColumnsToContents() wMain.tableWidget.resizeRowsToContents() for i in range(wMain.tableWidget.rowCount()): for j in range(wMain.tableWidget.columnCount()): wMain.tableWidget.setItem(i,j, QTableWidgetItem()) currentTime = time.localtime() print(currentTime.tm_year, ":", currentTime.tm_mon, ":", currentTime.tm_mday) wMain.dateEdit.setDate(QDate(currentTime.tm_year,currentTime.tm_mon,currentTime.tm_mday)) print(currentTime.tm_hour, ":", currentTime.tm_min, ":", currentTime.tm_sec) wMain.timeEdit.setTime(QTime(currentTime.tm_hour,currentTime.tm_min)) sys.exit(app.exec())Пытаюсь обработать изменение ячейки таблицы и почему-то вылетает сегфолт в slotCellChanged(self, i, j): Что я упустил?
Стив Баллмер врывается на сцену и, прыгая в диком угаре, орет: “recursion, recursion, recursion!!!”
Да, я походу это понял и теперь пытаюсь эту рекурсию побороть глобальной переменной со счётчиком, но не могу никак её объявить. Во всех местах уже пихал - не видит. Думает что она локальная и всё.
iCount = iCount + 1 ^^^^^^ UnboundLocalError: cannot access local variable 'iCount' where it is not associated with a valueТебе надо сделать выход из функции, если значение не менялось.
def slotCellChanged(self, i, j): iHours = 0 iTotal = 1 iCostHours = int(self.leCostHours.text()) s = self.tableWidget.item(i, iHours).text() if s.isdigit() == True: if int(s) > 15: s = str(15) self.tableWidget.item(i, iHours).setText(s) s = str(int(s) * iCostHours) if self.iCount < 2: self.iCount = self.iCount + 1 self.tableWidget.item(i, iTotal).setText(s) else: self.tableWidget.item(i, j).setText("") def slotCellClicked(self, i, j): self.iCount = 0 iHours = 0 iTotal = 1 if j == iTotal: self.tableWidget.setCurrentCell(i, iHours)Под конец дня победил глобальной переменной iCount. Обращение через self почему-то. :D
С облегчением!