button layut -anordnung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
kaysiebke86
User
Beiträge: 1
Registriert: Sonntag 26. Januar 2025, 00:21

Guten Tag an die Gemeinde, Ich bin neu hier wie auch was alles mit Python betrifft, und sollte ich hier im falschen sein dann verzeiht es mir bitte !

Nun zum Thema meines Problems ,ich habe ein Formular beidem ich mich gerade die zähne ausbeiße bei den Buttons, und zwar möchte ich gerne mein Print Button vertikal in der breite der Reset und des Eingab Feldes zusammen haben, bzw mein eingabefeld soll noch eine überschrieft (label erhalten).kann mir da einer vieleicht behielflich sein und mir als neuling hälfen

Code: Alles auswählen

import sys
from PyQt6.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, 
                             QHBoxLayout, QGridLayout, QLineEdit, QLabel, QPushButton, QFrame,
                             QComboBox, QSizePolicy, QCheckBox)
from PyQt6.QtCore import Qt, QSize, QSizeF, QMarginsF, QRectF
from PyQt6.QtGui import QPixmap, QPainter, QPageSize
from PyQt6.QtPrintSupport import QPrinter, QPrintDialog
import barcode
from barcode import Code128
from barcode.writer import ImageWriter
from io import BytesIO
from PIL import Image
from PIL.ImageQt import ImageQt

MM_TO_PIXEL = 3.779528  # 1mm = 3.779528 pixels at 96 DPI

class BarcodeApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()
        
    def initUI(self):
        self.setWindowTitle('Interaktives Barcode-Formular')
        self.setMinimumSize(800, 600)
        self.setStyleSheet("""
            QMainWindow {
                background-color: #021d49;
                font-family: Arial, sans-serif;
            }
            QLabel, QLineEdit, QPushButton, QComboBox, QCheckBox {
                color: white;
                font-size: 16px;
            }
            QLineEdit {
                padding: 6px;
                margin-bottom: 15px;
                border-radius: 4px;
                border: 1.3px solid #ccc;
                background-color: white;
                color: black;
            }
            QLineEdit:focus {
                outline: 2px solid #FF0000;
            }
            QPushButton {
                padding: 12px;
                font-weight: bold;
                border-radius: 4px;
                border: 1px solid #FF0000;
                background-color: #0b2652;
                color: white;
                width: 100%;
            }
            QPushButton:hover {
                background-color: #FF0000;
            }
            QPushButton:focus {
                outline: 2px solid #FF0000;
            }
            QPushButton:pressed {
                background-color: #FF0000;
            }
            QCheckBox {
                padding: 6px;
            }
            #previewFrame {
                background-color: white;
                border: 1px solid rgba(255, 255, 255, 0.6);
                border-radius: 4px;
            }
            #skuPreview {
                font-size: 24px;
                font-weight: bold;
                color: black;
            }
        """)

        main_widget = QWidget()
        self.setCentralWidget(main_widget)
        layout = QVBoxLayout(main_widget)
        layout.setAlignment(Qt.AlignmentFlag.AlignTop)
        layout.setContentsMargins(20, 0, 20, 0)

        form_container = QWidget()
        form_container.setMaximumWidth(int(120 * MM_TO_PIXEL))
        form_container.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed)
        form_layout = QVBoxLayout(form_container)
        form_layout.setAlignment(Qt.AlignmentFlag.AlignTop)
        form_layout.setContentsMargins(0, 0, 0, 0)

        # Language selection
        lang_layout = QHBoxLayout()
        self.lang_combo = QComboBox()
        self.lang_combo.addItems(['Deutsch', 'English', 'Polski'])
        self.lang_combo.currentIndexChanged.connect(self.change_language)
        lang_layout.addWidget(self.lang_combo)
        lang_layout.addStretch()
        form_layout.addLayout(lang_layout)

        # Info Box
        self.info_box = QFrame()
        self.info_box.setObjectName("previewFrame")
        self.info_box.setFixedSize(QSize(
            int(100 * MM_TO_PIXEL),
            int(35 * MM_TO_PIXEL)
        ))
        self.info_box.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed)

        info_box_layout = QVBoxLayout(self.info_box)
        self.sku_preview = QLabel('137673780')
        self.sku_preview.setObjectName("skuPreview")
        self.sku_preview.setAlignment(Qt.AlignmentFlag.AlignCenter)
        self.barcode_preview = QLabel()
        self.color_size_preview = QLabel('M | PINE GROVE')
        self.desc_preview = QLabel('ASOS DESIGN oversized boxy t-shirt')
        self.faulty_indicator = QLabel('Faulty: OFF')

        for label in [self.sku_preview, self.color_size_preview, self.desc_preview, self.faulty_indicator]:
            label.setStyleSheet('color: black;')
            label.setAlignment(Qt.AlignmentFlag.AlignCenter)

        info_box_layout.addWidget(self.sku_preview)
        info_box_layout.addWidget(self.barcode_preview)
        info_box_layout.addWidget(self.color_size_preview)
        info_box_layout.addWidget(self.desc_preview)
        info_box_layout.addWidget(self.faulty_indicator)

        form_layout.addWidget(self.info_box)

        # Form fields
        self.sku_label = QLabel('SKU:')
        self.sku_input = QLineEdit()
        self.desc_label = QLabel('Beschreibung:')
        self.desc_input = QLineEdit()

        # Color and Size in one row
        color_size_layout = QHBoxLayout()
        color_layout = QVBoxLayout()
        self.color_label = QLabel('Farbe:')
        self.color_input = QLineEdit()
        color_layout.addWidget(self.color_label)
        color_layout.addWidget(self.color_input)

        size_layout = QVBoxLayout()
        self.size_label = QLabel('Größe:')
        self.size_input = QLineEdit()
        size_layout.addWidget(self.size_label)
        size_layout.addWidget(self.size_input)

        color_size_layout.addLayout(color_layout)
        color_size_layout.addLayout(size_layout)

        # Add all form elements
        form_layout.addWidget(self.sku_label)
        form_layout.addWidget(self.sku_input)
        form_layout.addWidget(self.desc_label)
        form_layout.addWidget(self.desc_input)
        form_layout.addLayout(color_size_layout)

        # Buttons
        buttons_layout = QGridLayout()
        buttons_layout.setContentsMargins(0, 10, 0, 0)
        buttons_layout.setAlignment(Qt.AlignmentFlag.AlignTop)

        self.submit_input = QLineEdit()
        self.submit_input.setObjectName("submitInput")
        self.submit_input.setPlaceholderText("Eingabe hier...")
        self.submit_input.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed)

        self.reset_btn = QPushButton('Reset')
        self.reset_btn.setObjectName("btnReset")
        self.reset_btn.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed)

        self.print_btn = QPushButton('Drucken')
        self.print_btn.setObjectName("printButton")
        self.print_btn.setFixedWidth(self.reset_btn.sizeHint().width() * 2)
        self.print_btn.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed)

        buttons_layout.addWidget(self.submit_input, 0, 0)
        buttons_layout.addWidget(self.reset_btn, 1, 0)
        buttons_layout.addWidget(self.print_btn, 0, 1, 2, 1, Qt.AlignmentFlag.AlignVCenter)  # Vertically align print button

        form_layout.addLayout(buttons_layout)

        # Auto Reset and Faulty Indicator Switches
        self.auto_reset_switch = QCheckBox('Auto Reset')
        self.auto_reset_switch.stateChanged.connect(self.toggle_auto_reset)
        self.faulty_indicator_switch = QCheckBox('Faulty Indicator')
        self.faulty_indicator_switch.stateChanged.connect(self.toggle_faulty_indicator)

        switches_layout = QHBoxLayout()
        switches_layout.addWidget(self.auto_reset_switch)
        switches_layout.addWidget(self.faulty_indicator_switch)
        form_layout.addLayout(switches_layout)

        form_layout.addStretch()

        layout.addWidget(form_container, alignment=Qt.AlignmentFlag.AlignCenter)

        # Connect signals
        self.reset_btn.clicked.connect(self.reset_form)
        self.print_btn.clicked.connect(self.print_barcode)

        # Generate initial barcode
        self.generate_barcode('137673780')

    def toggle_auto_reset(self, state):
        if state == Qt.CheckState.Checked:
            print("Auto Reset ON")
        else:
            print("Auto Reset OFF")

    def toggle_faulty_indicator(self, state):
        if state == Qt.CheckState.Checked:
            self.faulty_indicator.setText('Faulty: ON')
        else:
            self.faulty_indicator.setText('Faulty: OFF')

    def generate_barcode(self, code):
        rv = BytesIO()
        Code128(code, writer=ImageWriter()).write(rv)
        image = Image.open(rv)
        qimage = ImageQt(image)
        pixmap = QPixmap.fromImage(qimage)
        scaled_pixmap = pixmap.scaledToWidth(350, Qt.TransformationMode.SmoothTransformation)
        self.barcode_preview.setPixmap(scaled_pixmap)

    def reset_form(self):
        self.sku_input.clear()
        self.desc_input.clear()
        self.color_input.clear()
        self.size_input.clear()

    def print_barcode(self):
        printer = QPrinter(QPrinter.PrinterMode.HighResolution)
        printer.setPageSize(QPageSize(QSizeF(100, 35), QPageSize.Unit.Millimeter))
        printer.setPageMargins(QMarginsF(0, 0, 0, 0))

        dialog = QPrintDialog(printer, self)
        if dialog.exec() == QPrintDialog.DialogCode.Accepted:
            painter = QPainter(printer)
            source_rect = QRectF(self.info_box.rect())
            target_rect = printer.pageRect(QPrinter.Unit.DevicePixel)

            scale = min(target_rect.width() / source_rect.width(),
                        target_rect.height() / source_rect.height())
            painter.scale(scale, scale)

            self.info_box.render(painter)
            painter.end()

    def change_language(self, index):
        languages = {
            0: {  # German
                'sku': 'SKU:',
                'desc': 'Beschreibung:',
                'color': 'Farbe:',
                'size': 'Größe:',
                'reset': 'Zurücksetzen',
                'print': 'Drucken'
            },
            1: {  # English
                'sku': 'SKU:',
                'desc': 'Description:',
                'color': 'Color:',
                'size': 'Size:',
                'reset': 'Reset',
                'print': 'Print'
            },
            2: {  # Polish
                'sku': 'SKU:',
                'desc': 'Opis:',
                'color': 'Kolor:',
                'size': 'Rozmiar:',
                'reset': 'Resetuj',
                'print': 'Drukuj'
            }
        }

        lang = languages[index]
        self.sku_label.setText(lang['sku'])
        self.desc_label.setText(lang['desc'])
        self.color_label.setText(lang['color'])
        self.size_label.setText(lang['size'])
        self.reset_btn.setText(lang['reset'])
        self.print_btn.setText(lang['print'])

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = BarcodeApp()
    window.show()
    sys.exit(app.exec())
Antworten