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())