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
PyQt6 lineEdit-Feld addieren
- __blackjack__
- User
- Beiträge: 13931
- 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.
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.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
— Scott Bellware
-
- User
- Beiträge: 6
- Registriert: Freitag 6. Oktober 2023, 05:29
Danke für die schnelle Reaktionen.
Hier der Code von den beiden Dateien.
Die Hauptdatei
Die Datei rechner.py
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.
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()
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
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.
`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.
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(".", ","))
-
- User
- Beiträge: 6
- 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.
Also jetzt versteh ich nichts mehr grins..
Danke für die schnelle Antwort von Dir.
- __blackjack__
- User
- Beiträge: 13931
- 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.
`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.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
— Scott Bellware