LINUXTALKS.CO

Project T - новый проект лаборатории на Python + PyQt6

 , , , ,

L


0

1

Котаны, приветствую!

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

Есть ли понятие класса в Python’e? Мне сразу проектировать его как ООП или в скриптовом языке это невозможно?

★★★★★★
Ответ на: комментарий от kevlarbeaver

У меня есть 5 проектов: Кроссворд на С++, электронная библиотека и система тестирования школьников, кроссворд на lazarus и прога для статических сайтов. Это новый проЭкт.

xwicked
★★★★★★
Windows / Firefox (LT)

В инете пишут про создание панели главного меню руками, а как обраться к главному меню из ui-формы? Вижу, что активно используют так называемый Sender() с указателем того, кто отправляет сигнал. Так вот как правильно всё это привязать?

xwicked
★★★★★★
Windows / Firefox (LT)
Ответ на: комментарий от Harald

чому не на сишечке или цепепе

В прошлой теме написал, что мне юную самочку нужно научить кодингу и этот проект, как обучающий материал. Ей в школе преподавали python, поэтому я не хочу травмировать её психику c++. :D

xwicked
★★★★★★
Последнее исправление: xwicked (всего исправлений: 1)

Android / Firefox (PL)
Ответ на: комментарий от MrSugoma2

Я относительно недавно прозрел и понял, что Python является злом и должен быть запрещен.

Согласен, но мне нужно на собственном примере убедиться, насколько всё плохо.

xwicked
★★★★★★
Android / Firefox (PL)
Ответ на: комментарий от cocucka

Никогда не знаешь, как подействуют грибы, которые он жрёт перед началом разработки

Когда я говорил про скорый выпуск следующей версии кроссворда, то у меня ничего не получалось. Чтобы не спугнуть, пока не говорю что это, а если получится и будет время для разработки, то расскажу. :ь

xwicked
★★★★★★
Windows / Firefox (NL)
Ответ на: комментарий от cocucka

Прозреваю ERP или ещё какую мамкину бухгалтерию, например, учёт еды доя рецептов.

Вполне себе развитие электронной библиотеки.



Android / Firefox (T1)
from PyQt6 import QtWidgets, QtCore
import sys, os, ui_mainwindow, TAboutProgram_ui

app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QMainWindow()
uiMain = ui_mainwindow.Ui_MainWindow()
uiAbout = TAboutProgram_ui.Ui_TAboutProgram
uiMain.setupUi(window)
uiMain.pushButton.clicked.connect(QtWidgets.QApplication.instance().quit)
#def sExitProgram(self): QtWidgets.QApplication.instance().quit
selectedAction = app.sender()
uiMain.menubar.actionAt((QtCore.QPoint(selectedAction.objectName))).triggered.connect(QtWidgets.QApplication.instance().quit)
window.show()
sys.exit(app.exec())

Мне нужно до начала программы посвязывать все пункты меню со слотами. sender() и self, я так понимаю не могу использовать, так как это объекты вермени выполнения?

xwicked
★★★★★★
Последнее исправление: xwicked (всего исправлений: 1)

Windows / Firefox (LT)
uiMain.menubar.actions()[0].setText("Yes!")

Первый прогресс. Это сработало. Теперь нужно как-то вычислять индекс нажатого меню и могу перейти к связыванию со слотами.

xwicked
★★★★★★
Последнее исправление: xwicked (всего исправлений: 1)

Windows / Firefox (LT)
**  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
import sys, os, mainwindow_ui, TAboutProgram_ui

class uiMain (QtWidgets.QMainWindow, mainwindow_ui.Ui_MainWindow):
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)
        self.setupUi(self);

    def slotQuit(self):
        QtCore.QCoreApplication.exit()

app = QtWidgets.QApplication(sys.argv)
window = uiMain()
window.show()
sys.exit(app.exec())

Первый рабочий код. Слоты сделал в дизайнере и связываю их с исполняемой частью уже в коде.
Установил Pyinstaller и сделал исполняемый файл, но не могу побороть зависимости libc и ld-linux-x86-64.so.2. С libc проблему решил:

DIR=`pwd`
LD_LYBRARY_PATH=$LD_LYBRARY_PATH:$DIR
export LD_LYBRARY_PATH

А ld-linux-x86-64.so.2 не видит, лезет в /lib64.

xwicked
★★★★★★
Windows / Firefox (AE)
# ======================================================================
#   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): Что я упустил?

xwicked
★★★★★★
Последнее исправление: xwicked (всего исправлений: 1)

Windows / Firefox (AE)
Ответ на: комментарий от Anoxemian

Стив Баллмер врывается на сцену и, прыгая в диком угаре, орет: «recursion, recursion, recursion!!!!!»

Да, я походу это понял и теперь пытаюсь эту рекурсию побороть глобальной переменной со счётчиком, но не могу никак её объявить. Во всех местах уже пихал - не видит. Думает что она локальная и всё.

iCount = iCount + 1
             ^^^^^^
UnboundLocalError: cannot access local variable 'iCount' where it is not associated with a value
xwicked
★★★★★★
Windows / Firefox (AE)