Что делать, если твой код кажется говнокодом?
Что делать, если я пишу код, что-то делаю, но мне постоянно кажется, что мой код - полный отстой и говнокодище?
Я из-за этого работать нормально не могу и каждую минуту переписываю свой код, гоняя из пустого в порожнее.
Помогите :(
Вот мой код:
модуль gui.py - основной модуль, в котором я рисую интерфейс:
from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton, QMainWindow, QHBoxLayout, QVBoxLayout,
QLabel, QBoxLayout, QGraphicsDropShadowEffect, QGridLayout, QSizePolicy)
from PyQt5.QtGui import QIcon, QPalette, QColor, QPixmap, QImage
from PyQt5.QtCore import QThread, pyqtSignal, pyqtSlot, QSize, Qt, QObject
from logic import *
import rage_gui as rgui
import sys
class App(QMainWindow):
def __init__(self, title, posX=0, posY=0, sizeW=100, sizeH=100, parent=None):
super().__init__(parent)
self.posX, self.posY = posX, posY
self.sizeW, self.sizeH = sizeW, sizeH
self.setGeometry(posX, posY, sizeW, sizeH)
self.setWindowTitle(title)
self.initUI()
def initUI(self):
back = rgui.RCVBackground(self)
back.setTitleLabel("Выберите настройки:")
back.appendWidget(rgui.RCSameLine((
QLabel("Распознавание:"),
QPushButton("Включить")
)))
back.setVStretch(True)
if __name__=="__main__":
app = QApplication(sys.argv)
deskX, deskY = QApplication.desktop().width(), QApplication.desktop().height()
width, height = 600, 500
window = App("Fuck...", deskX//2-width//2, deskY//2-height//2, width, height)
window.show()
sys.exit(app.exec())
Модель rage_gui.py - модуль, в который я выношу полезные классы, чтобы сократить код и уменьшить рутинную работу:
from PyQt5.QtWidgets import (QWidget, QLabel, QHBoxLayout, QVBoxLayout)
from PyQt5.QtCore import Qt
class RCSameLine(QWidget):
def __init__(self, widgets=[]):
super().__init__()
layout = QHBoxLayout()
self.setLayout(layout)
for widget in widgets:
layout.addWidget(widget)
layout.addStretch(1)
class RCVBackground(QWidget):
def __init__(self, parent):
super().__init__()
self.widgets = []
self.back = QVBoxLayout()
self.setLayout(self.back)
parent.setCentralWidget(self)
def appendWidget(self, widget):
self.back.addWidget(widget)
def setTitleLabel(self, text):
title = QLabel(text)
title.setAlignment(Qt.AlignCenter)
self.back.addWidget(title)
def setVStretch(self, stretch=False):
if stretch: self.back.addStretch(1)
Это обрезок кода, минимальный. И вот мне кажется, что я постоянно делаю что-то не так. Что можно сделать проще или то, что я вообще пишу какую-то дичь. Может самовнушение, а может...
Ответы (1 шт):
Мое мнение очень субъективное.
Я бы не стал делать класс RCVBackground - это центральное окно
и я вижу действия, которые вы в нем прописали, должны быть в main.py.
Класс RCSameLine очень даже имеет смысл, т.к. наделен определенной функциональностью.
Я не знаю какой конечный вид должно получить ваше главное окно,
поэтому менеджеры компоновки не менял.
Я добавил setStyleSheet, чтобы вы видели где реально располагается
и как отрисовывается объект, созданный классом RCSameLine.
Я добавил виджет QGroupBox, потому что без него мне не понравилось.
Мне так кажется, что без QScrollArea вам не обойтись https://doc.qt.io/qt-5/qscrollarea.html
import sys
from PyQt5.QtWidgets import (
QApplication, QWidget, QPushButton, QMainWindow, QHBoxLayout, QVBoxLayout,
QLabel, QBoxLayout, QGraphicsDropShadowEffect, QGridLayout, QSizePolicy,
QGroupBox
)
from PyQt5.QtGui import QIcon, QPalette, QColor, QPixmap, QImage
from PyQt5.QtCore import QThread, pyqtSignal, pyqtSlot, QSize, Qt, QObject
# ? from logic import *
#from rage_gui import RCSameLine
# вы можете перенести этот класс в отдельный модуль, разницы никакой нет.
class RCSameLine(QWidget):
def __init__(self, widgets=[], parent=None):
super(RCSameLine, self).__init__(parent)
self.setMinimumSize(200, 70)
self.setStyleSheet("background-color: #bbb; ")
self.group_box_settings = QGroupBox(f'{widgets[0].text()}', self)
layout = QHBoxLayout(self.group_box_settings)
for widget in widgets:
layout.addWidget(widget)
# ? layout.addStretch(1)
class MainWindow(QMainWindow):
def __init__(self, title, posX=0, posY=0, sizeW=100, sizeH=100, parent=None):
super().__init__(parent)
self.posX, self.posY = posX, posY
self.sizeW, self.sizeH = sizeW, sizeH
self.setGeometry(posX, posY, sizeW, sizeH)
self.setWindowTitle(title)
self.initUI()
def initUI(self):
self.centralWidget = QWidget()
self.setCentralWidget(self.centralWidget)
self.mainLayout = QVBoxLayout(self.centralWidget)
# ? self.widgets = []
titleLabel = self.setTitleLabel("Выберите настройки:")
self.mainLayout.addWidget(titleLabel)
self.rguiLabel = QLabel("Распознавание:")
self.rguiButton = QPushButton("Включить")
self.rcSameLine = RCSameLine([self.rguiLabel, self.rguiButton], self)
self.mainLayout.addWidget(self.rcSameLine)
self.rguiLabel2 = QLabel("Распознавание_2:")
self.rguiButton2 = QPushButton("Включить_2")
self.rcSameLine2 = RCSameLine([self.rguiLabel2, self.rguiButton2], self)
self.mainLayout.addWidget(self.rcSameLine2)
self.setVStretch(True) # тоже не совсем понятно,
# почему не просто 'self.mainLayout.addStretch(1)'
#? def appendWidget(self, widget):
#? self.back.addWidget(widget)
def setTitleLabel(self, text):
self.titleLabel = QLabel(f"<h1>{text}</h1>")
self.titleLabel.setAlignment(Qt.AlignCenter)
return self.titleLabel
def setVStretch(self, stretch=False):
if stretch: self.mainLayout.addStretch(1)
if __name__=="__main__":
app = QApplication(sys.argv)
deskX, deskY = QApplication.desktop().width(), QApplication.desktop().height()
width, height = 600, 500
window = MainWindow("Fuck...", deskX//2-width//2, deskY//2-height//2, width, height)
window.show()
sys.exit(app.exec_())
