PyQt6 lineEdit-Feld addieren

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Corratec22
User
Beiträge: 3
Registriert: Freitag 6. Oktober 2023, 05:29

Hallo,
zu erst, bin anfänger noch. Hab da 2 Fragen.
Hab mir über PySide6-Designer ein MainWindow erstellt mit 2 lineEdit.
Einmal heißt er "lineEdit_Online" und "lineEdit_Telefon" und die möchte ich beide addieren und dann in einem Label "label_Bar_Summe" anzeigen.
Aber leider kriege ich das nicht hin. Hab schon gegooglet und einige Youtubs angesehen ohne Erfolg.
Kann mir jemand dabei helfen?

Und die andere,
kann ich bei "lineEdit_Gesamt" mit einer festen Zahl multiplizieren?
Meine es so als Beispiel, 10*0,80€ und das Eregbnis möchte ich dann in "label_Gesammt" eintragen/ausgeben.

Danke voraus schon mal.
Mfg
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Was hast Du konkret versucht, und woran scheiterst Du?
Bitte zeigen den relevanten Code und die genaue Fehlermeldung die Du erhältst.
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Corratec22: Man kann `QLineEdit`-Objekte nicht addieren. Das sind grafische Elemente. Die *enthalten* einen Text, den man mit der entsprechenden Methode abfragen kann. Damit kann man auch noch nicht rechnen, diese Zeichenkette muss man erst in eine Zahl umwandeln. Zahlen kann man dann addieren und multiplizieren. Und Ergebnisse mit der entsprechenden Methode auf den Label-Objekten nach dem umwandeln in eine Zeichenkette als Text setzen.

Das ganze muss durch irgendein Ereignis ausgelöst werden, beispielsweise durch einen Button, dessen `clicked`-Signal man mit einer Funktion oder Methode verbindet. Wenn Funktion, dann braucht man `functools.partial()`, denn das Fensterobjekt muss da ja irgendwie rein kommen, oder man schreibt eine Klasse und hat dort das Fenster entweder als Attribut oder man erbt von dem QWidget das im Designer als Container für alles verwendet wurde, und übergibt das Objekt an die `loadUi()`-Funktion als zweites Argument.

Wo man auch noch drauf achten muss sind Fehleingaben vom Benutzer. Auf die Ausnahmen die da beim Umwandeln in eine Zahl auftreten können, sollte man sinnvoll reagieren. Oder dafür sorgen, dass da immer was umwandelbares im Eingabefeld steht und der Benutzer nichts eingeben kann was sich nicht umwandeln lässt. Es gibt für Zahlen auch speziellere Eingabeelemente von Qt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Corratec22
User
Beiträge: 3
Registriert: Freitag 6. Oktober 2023, 05:29

Danke für die schnelle Reaktionen.
Hier der Code von den beiden Dateien.

Die Hauptdatei

Code: Alles auswählen

from PySide6.QtWidgets import QApplication, QMainWindow
from Gerüst.rechner import Ui_MainWindow

class Frm_main(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        # Initialisiere die Labels mit einem leeren String
        self.lineEdit_Online_Bar.setText("")
        self.lineEdit_Telefon_Bar.setText("")

                # Füge einen Handler für die `add_numbers()`-Schaltfläche hinzu.
        self.action_add_numbers.triggered.connect(self.add_numbers)


        # Hier fügst du den Code ein, den ich dir gegeben habe
        def add_numbers(sender):
            value1 = float(self.lineEdit_Online_Bar.text().replace(",", ".")) or 0
            value2 = float(self.lineEdit_Telefon_Bar.text().replace(",", ".")) or 0

            # Überprüfe, ob beide Werte nicht leer sind.
            if value1 and value2:
                result = value1 + value2
                result = round(result, 2)
                result = str(result).replace(".", ",")
                self.label_Bar_Summe.setText(f"{result} €")

        def on_click(self):
            # Get the text from the text input
            text = self.text_input.text()

            # Convert the text to a float
            number = float(text)

            # Multiply the number by 0.8€
            multiplied_number = number * 0.8

            # Set the text of the label
            self.label_Gesammt_Online.setText(str(multiplied_number))


            self.lineEdit_Online_Bar.textChanged.connect(add_numbers)
            self.lineEdit_Telefon_Bar.textChanged.connect(add_numbers)

if __name__ == "__main__":
    app = QApplication()
    rechner = Frm_main()
    rechner.show()
    app.exec()
Die Datei rechner.py

Code: Alles auswählen

# -*- coding: utf-8 -*-

################################################################################
## Form generated from reading UI file 'rechner.ui'
##
## Created by: Qt User Interface Compiler version 6.5.2
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################

from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
    QMetaObject, QObject, QPoint, QRect,
    QSize, QTime, QUrl, Qt)
from PySide6.QtGui import (QAction, QBrush, QColor, QConicalGradient,
    QCursor, QFont, QFontDatabase, QGradient,
    QIcon, QImage, QKeySequence, QLinearGradient,
    QPainter, QPalette, QPixmap, QRadialGradient,
    QTransform)
from PySide6.QtWidgets import (QApplication, QFrame, QLabel, QLineEdit,
    QMainWindow, QMenu, QMenuBar, QSizePolicy,
    QStatusBar, QWidget)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        if not MainWindow.objectName():
            MainWindow.setObjectName(u"MainWindow")
        MainWindow.resize(600, 560)
        MainWindow.setMinimumSize(QSize(600, 560))
        MainWindow.setMaximumSize(QSize(600, 560))
        self.action_Beenden = QAction(MainWindow)
        self.action_Beenden.setObjectName(u"action_Beenden")
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName(u"centralwidget")
        self.label = QLabel(self.centralwidget)
        self.label.setObjectName(u"label")
        self.label.setGeometry(QRect(250, 10, 251, 41))
        font = QFont()
        font.setPointSize(18)
        font.setBold(True)
        self.label.setFont(font)
        self.label.setAlignment(Qt.AlignCenter)
        self.label_2 = QLabel(self.centralwidget)
        self.label_2.setObjectName(u"label_2")
        self.label_2.setGeometry(QRect(120, 80, 150, 40))
        font1 = QFont()
        font1.setPointSize(12)
        self.label_2.setFont(font1)
        self.lineEdit_Online_Bar = QLineEdit(self.centralwidget, placeholderText="0.00€")
        self.lineEdit_Online_Bar.setObjectName(u"lineEdit_Online_Bar")
        self.lineEdit_Online_Bar.setGeometry(QRect(300, 90, 113, 22))
        self.lineEdit_Telefon_Bar = QLineEdit(self.centralwidget, placeholderText="0.00€")
        self.lineEdit_Telefon_Bar.setObjectName(u"lineEdit_Telefon_Bar")
        self.lineEdit_Telefon_Bar.setGeometry(QRect(300, 120, 113, 22))
        self.lineEdit_Gesammt_Online = QLineEdit(self.centralwidget, placeholderText="0.00€")
        self.lineEdit_Gesammt_Online.setObjectName(u"lineEdit_Gesammt_Online")
        self.lineEdit_Gesammt_Online.setGeometry(QRect(300, 240, 113, 22))
        self.lineEdit_6 = QLineEdit(self.centralwidget, placeholderText="0.00€")
        self.lineEdit_6.setObjectName(u"lineEdit_6")
        self.lineEdit_6.setGeometry(QRect(300, 340, 113, 22))
        self.label_3 = QLabel(self.centralwidget)
        self.label_3.setObjectName(u"label_3")
        self.label_3.setGeometry(QRect(120, 110, 150, 40))
        self.label_3.setFont(font1)
        self.label_4 = QLabel(self.centralwidget)
        self.label_4.setObjectName(u"label_4")
        self.label_4.setGeometry(QRect(120, 160, 150, 40))
        self.label_4.setFont(font1)
        self.label_Bar_Summe = QLabel(self.centralwidget)
        self.label_Bar_Summe.setObjectName(u"label_Bar_Summe")
        self.label_Bar_Summe.setGeometry(QRect(300, 160, 150, 40))
        font2 = QFont()
        font2.setPointSize(14)
        font2.setBold(True)
        self.label_Bar_Summe.setFont(font2)
        self.label_Bar_Summe.setAlignment(Qt.AlignCenter)
        self.label_6 = QLabel(self.centralwidget)
        self.label_6.setObjectName(u"label_6")
        self.label_6.setGeometry(QRect(110, 230, 150, 40))
        self.label_6.setFont(font1)
        self.label_7 = QLabel(self.centralwidget)
        self.label_7.setObjectName(u"label_7")
        self.label_7.setGeometry(QRect(110, 270, 150, 40))
        self.label_7.setFont(font1)
        self.label_8 = QLabel(self.centralwidget)
        self.label_8.setObjectName(u"label_8")
        self.label_8.setGeometry(QRect(110, 370, 150, 40))
        self.label_8.setFont(font1)
        self.line = QFrame(self.centralwidget)
        self.line.setObjectName(u"line")
        self.line.setGeometry(QRect(0, 150, 800, 16))
        self.line.setFrameShape(QFrame.HLine)
        self.line.setFrameShadow(QFrame.Sunken)
        self.line_2 = QFrame(self.centralwidget)
        self.line_2.setObjectName(u"line_2")
        self.line_2.setGeometry(QRect(0, 210, 800, 16))
        self.line_2.setFrameShape(QFrame.HLine)
        self.line_2.setFrameShadow(QFrame.Sunken)
        self.label_9 = QLabel(self.centralwidget)
        self.label_9.setObjectName(u"label_9")
        self.label_9.setGeometry(QRect(110, 330, 150, 40))
        self.label_9.setFont(font1)
        self.label_Gesamt_Online = QLabel(self.centralwidget)
        self.label_Gesamt_Online.setObjectName(u"label_Gesamt_Online")
        self.label_Gesamt_Online.setGeometry(QRect(300, 270, 150, 40))
        self.label_Gesamt_Online.setFont(font2)
        self.label_Gesamt_Online.setAlignment(Qt.AlignCenter)
        self.line_3 = QFrame(self.centralwidget)
        self.line_3.setObjectName(u"line_3")
        self.line_3.setGeometry(QRect(0, 310, 800, 16))
        self.line_3.setFrameShape(QFrame.HLine)
        self.line_3.setFrameShadow(QFrame.Sunken)
        self.label_Gesamt_Stunden = QLabel(self.centralwidget)
        self.label_Gesamt_Stunden.setObjectName(u"label_Gesamt_Stunden")
        self.label_Gesamt_Stunden.setGeometry(QRect(300, 370, 150, 40))
        self.label_Gesamt_Stunden.setFont(font2)
        self.label_Gesamt_Stunden.setAlignment(Qt.AlignCenter)
        self.line_4 = QFrame(self.centralwidget)
        self.line_4.setObjectName(u"line_4")
        self.line_4.setGeometry(QRect(0, 410, 800, 16))
        self.line_4.setFrameShape(QFrame.HLine)
        self.line_4.setFrameShadow(QFrame.Sunken)
        self.label_10 = QLabel(self.centralwidget)
        self.label_10.setObjectName(u"label_10")
        self.label_10.setGeometry(QRect(110, 440, 150, 40))
        self.label_10.setFont(font2)
        self.label_Gesamt_Stunden_2 = QLabel(self.centralwidget)
        self.label_Gesamt_Stunden_2.setObjectName(u"label_Gesamt_Stunden_2")
        self.label_Gesamt_Stunden_2.setGeometry(QRect(300, 440, 150, 40))
        self.label_Gesamt_Stunden_2.setFont(font2)
        self.label_Gesamt_Stunden_2.setAlignment(Qt.AlignCenter)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(MainWindow)
        self.menubar.setObjectName(u"menubar")
        self.menubar.setGeometry(QRect(0, 0, 600, 22))
        self.menu_Men = QMenu(self.menubar)
        self.menu_Men.setObjectName(u"menu_Men")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(MainWindow)
        self.statusbar.setObjectName(u"statusbar")
        MainWindow.setStatusBar(self.statusbar)
        QWidget.setTabOrder(self.lineEdit_Online_Bar, self.lineEdit_Telefon_Bar)
        QWidget.setTabOrder(self.lineEdit_Telefon_Bar, self.lineEdit_Gesammt_Online)
        QWidget.setTabOrder(self.lineEdit_Gesammt_Online, self.lineEdit_6)

        self.menubar.addAction(self.menu_Men.menuAction())
        self.menu_Men.addAction(self.action_Beenden)

        self.retranslateUi(MainWindow)

        QMetaObject.connectSlotsByName(MainWindow)
    # setupUi

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
        self.action_Beenden.setText(QCoreApplication.translate("MainWindow", u"&Beenden", None))
        self.label.setText(QCoreApplication.translate("MainWindow", u"Fahrer Abrechnung", None))
        self.label_2.setText(QCoreApplication.translate("MainWindow", u"Online Bar:", None))
        self.label_3.setText(QCoreApplication.translate("MainWindow", u"Telefon Bar:", None))
        self.label_4.setText(QCoreApplication.translate("MainWindow", u"Online Bar:", None))
        self.label_Bar_Summe.setText(QCoreApplication.translate("MainWindow", u"Summe", None))
        self.label_6.setText(QCoreApplication.translate("MainWindow", u"Gesamte Online:", None))
        self.label_7.setText(QCoreApplication.translate("MainWindow", u"Online Bar:", None))
        self.label_8.setText(QCoreApplication.translate("MainWindow", u"Online Bar:", None))
        self.label_9.setText(QCoreApplication.translate("MainWindow", u"Stunden:", None))
        self.label_Gesamt_Online.setText(QCoreApplication.translate("MainWindow", u"Summe", None))
        self.label_Gesamt_Stunden.setText(QCoreApplication.translate("MainWindow", u"Summe", None))
        self.label_10.setText(QCoreApplication.translate("MainWindow", u"Gesammt:", None))
        self.label_Gesamt_Stunden_2.setText(QCoreApplication.translate("MainWindow", u"Summe", None))
        self.menu_Men.setTitle(QCoreApplication.translate("MainWindow", u"&Men\u00fc", None))
    # retranslateUi


Habe schon mit Hilfe von Google Bard versucht es hinzubekommen.
Den ersten Teil habe ich schon hinbekommen.mit " Online & Telefon Online Bar" aber als ich das mit dann mit dem "Gesamt Online hinbekommen möchte passiert, das keine Ergebnisse mehr angezeigt werden in den Labels, wo "Summe" steht.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

`action_add_numbers` existiert nicht und on_click benutzt Du nicht, also kann da gar nichts passieren. Das ist also nicht der Code, der angeblich ja funktioniert.

Man erzeugt aus den ui-Dateien keine Pythondateien, sondern lädt die ui-Dateien direkt.
Das `or 0` ist unsinnig, da ein float nur dann zu False evaluiert, wenn der Wert schon 0 ist.
Eine saubere Fehlerabfrage, ob wirklich eine Zahl eingegeben worden ist, ersetzt das aber auch nicht.
round benutzt man nicht, für Ausgaben gibt es Formatangaben.

Code: Alles auswählen

result = value1 + value2
self.label_Bar_Summe.setText(f"{result:.2f} €".replace(".", ","))
Corratec22
User
Beiträge: 3
Registriert: Freitag 6. Oktober 2023, 05:29

Danke Sirius3, habe auf YouTube aber gesehen das man die *.ui umwandelt und dann einbindet, bei Qt6. Aus einem alten allerdings hat ein anderer sie nicht umgewandelt, bei seiner Version Qt5.
Also jetzt versteh ich nichts mehr grins..

Danke für die schnelle Antwort von Dir.
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Corratec22: Du hast auf YouTube nicht gesehen das ”man” die *.ui in Python-Quelltext umwandelt, sondern dass das halt irgendwer auf YouTube gemacht hat. Man kann die Datei umwandeln, aber man macht das nicht, weil man auch ohne diesen unnötigen, zusätzlichen Schritt auskommen kann.

`add_numbers()` existiert übrigens auch nicht als Methode. Sollte es aber, denn man definiert in Funktionen oder Methoden normalerweise keine lokalen Funktionen. Das macht man bei extrem simplen Funktionen die man aus syntaktischen Gründen nicht als ``lambda``-Ausdruck schreiben kann, oder wenn man *wirklich* ein Closure haben will. Dann gibt man dieses Closure aber üblicherweise als Rückgabewert an den Aufrufer. Alles andere lässt sich auch relativ schlecht testen.

An der generierten Datei sieht man noch einen Fehler: Absolute Grössen- und Positionsangaben in Pixeln. Das funktioniert nicht wirklich bei der heutigen Bandbreite von Bildschirmgrössen, -auflösungen, und -einstellungen. Für die Anordnung verwendet man Layouts und die Grösse(n) ergeben sich dann automatisch aus dem Inhalt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten