Berechnung in GUI einfügen?

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
cougartrader
User
Beiträge: 11
Registriert: Sonntag 11. August 2013, 15:12

Hallo

ich geb ja nicht auf, auch wenn ich manchmal etwas langsam bin ;)

Da ich ja nur für mich etwas Spielkram machen möchte, kann ich mir ja auch eine GUI zusammenklicken. Da hab ich einen Test gemacht mit dem
Qt-Designer. Dann hab ich die .ui in .py umgewandelt und ein script erstellt, das mir die GUI einliest, da man in
der neuen .py ja nicht "rumfummeln" soll... ich weiss nicht genau, wie ich es erklären soll :(

Ich hab 3 Felder und 2 Buttons drin, in 2 der Felder sollen Werte eingetragen werden und dann ganz simpel automatisch
im 3. Feld zusammengezählt werden.

Ein Button leert die Felder und einer schliesst das "Programm".

Hier mal die umgewandelte GUI Datei

Code: Alles auswählen

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

# Form implementation generated from reading ui file 'test.ui'
#
# Created: Sat Aug  31 13:53:09 2013
#      by: PyQt4 UI code generator 4.9.1
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName(_fromUtf8("Dialog"))
        Dialog.resize(506, 437)
        self.pushClose = QtGui.QPushButton(Dialog)
        self.pushClose.setGeometry(QtCore.QRect(380, 390, 98, 27))
        self.pushClose.setObjectName(_fromUtf8("pushClose"))
        self.lineWert = QtGui.QLineEdit(Dialog)
        self.lineWert.setGeometry(QtCore.QRect(110, 30, 113, 27))
        self.lineWert.setObjectName(_fromUtf8("lineWert"))
        self.lineWert_2 = QtGui.QLineEdit(Dialog)
        self.lineWert_2.setGeometry(QtCore.QRect(110, 70, 113, 27))
        self.lineWert_2.setObjectName(_fromUtf8("lineWert_2"))
        self.lineWert_3 = QtGui.QLineEdit(Dialog)
        self.lineWert_3.setGeometry(QtCore.QRect(110, 130, 113, 27))
        self.lineWert_3.setObjectName(_fromUtf8("lineWert_3"))
        self.label = QtGui.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(20, 40, 66, 17))
        self.label.setObjectName(_fromUtf8("label"))
        self.label_2 = QtGui.QLabel(Dialog)
        self.label_2.setGeometry(QtCore.QRect(20, 80, 66, 17))
        self.label_2.setObjectName(_fromUtf8("label_2"))
        self.label_3 = QtGui.QLabel(Dialog)
        self.label_3.setGeometry(QtCore.QRect(20, 140, 66, 17))
        self.label_3.setObjectName(_fromUtf8("label_3"))
        self.pushClear = QtGui.QPushButton(Dialog)
        self.pushClear.setGeometry(QtCore.QRect(270, 80, 98, 27))
        self.pushClear.setObjectName(_fromUtf8("pushClear"))

        self.retranslateUi(Dialog)
        QtCore.QObject.connect(self.pushClose, QtCore.SIGNAL(_fromUtf8("clicked()")), Dialog.close)
        QtCore.QObject.connect(self.pushClear, QtCore.SIGNAL(_fromUtf8("clicked()")), self.lineWert.clear)
        QtCore.QObject.connect(self.pushClear, QtCore.SIGNAL(_fromUtf8("clicked()")), self.lineWert_2.clear)
        QtCore.QObject.connect(self.pushClear, QtCore.SIGNAL(_fromUtf8("clicked()")), self.lineWert_3.clear)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8))
        self.pushClose.setText(QtGui.QApplication.translate("Dialog", "Close", None, QtGui.QApplication.UnicodeUTF8))
        self.label.setText(QtGui.QApplication.translate("Dialog", "Wert", None, QtGui.QApplication.UnicodeUTF8))
        self.label_2.setText(QtGui.QApplication.translate("Dialog", "Wert_1", None, QtGui.QApplication.UnicodeUTF8))
        self.label_3.setText(QtGui.QApplication.translate("Dialog", "Wert_2", None, QtGui.QApplication.UnicodeUTF8))
        self.pushClear.setText(QtGui.QApplication.translate("Dialog", "Clear", None, QtGui.QApplication.UnicodeUTF8))


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    Dialog = QtGui.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())
Und hier das script, welches die test.py aufruft, dort in den Zeilen 25 - 27 werden die Eingabefelder aufgerufen

Code: Alles auswählen

from PyQt4 import QtCore,QtGui
import sys
import test
class testl(QtGui.QDialog,test.Ui_Dialog):
    """
    testl is inherited from both QtGui.QDialog and test.Ui_Dialog
    """
    def __init__(self,parent=None):
        """
            Initialization of the class. Call the __init__ for the super classes
        """
        super(testl,self).__init__(parent)
        self.setupUi(self)
        self.connectActions()
    def main(self):
        self.show()
    def connectActions(self):
        """
        Connect the user interface controls to the logic
        """
        self.pushClose.clicked.connect(self.destroy)   
              
    def myprint(self):
       
        self.lineWert.int(input('  ')) 
        self.lineWert_2.int(input(''))
        self.lineWert_3.int(lineWert + lineWert_2)
if __name__=='__main__':
    app = QtGui.QApplication(sys.argv)
    testl1 = testl()
    testl1.main()
    sys.exit(app.exec_())
Ich fummeln da schon eine Weile rum und komm nicht drauf, wie ich es anstellen muss, das man in lineWert und lineWert_2 Zahlen eingibt
und diese dann in lineWert_3 automatisch zusammengzählt werden.
Alternativ könnte ich auch einen weiteren Button einfügen, der das addieren veranlasst, aber auch da hänge ich... wobei mir das noch lieber wäre.
"Vorbereitet" hab ich das, siehe def myprint(self)
Ansonsten fehlt aktuell der Aufruf für myprint, ich hab heute soviel probiert, der ist mittlerweile abhanden gekommen...

LG
Holger
BlackJack

@cougartrader: An der generierten Datei fällt auf, dass Du anscheinend die Elemente absolut positioniert hast, was man nicht machen sollte wenn das nicht nur auf dem Rechner vernünftig aussehen soll auf dem es zusammengeklickt wurde. Damit das überall ordentlich angezeigt werden kann, gibt es verschiedene Layoutmanager.

Den Umweg über eine generierte Datei geht man eigentlich auch nicht mehr. Man kann die *.ui-Datei direkt verwenden mit dem `PyQt4.uic`-Modul.

Was meinst Du mit „ganz simpel automatisch”? Wann gennau soll denn die Rechnung stattfinden? So simpel ist das ja gar nicht. Einfach wäre eine weitere Schaltfläche mit der man die Berechnung auslöst. Ansonsten muss man sich überlegen welche Ereignisse eine Neuberechnung auslösen. Zum Beispiel jedes mal wenn der Inhalt eines der beiden Eingabefelder verändert wurde. Oder wenn ein Eingabefeld den Fokus verliert. Und vielleicht zusätzlich wenn die Eingabetaste in einem der Eingabefelder betätigt wird. Da musst Du dann die jeweiligen Signale von diesen Ereignissen mit einem Slot, also einer Methode verbinden, welche die beiden Eingabefelder ausliest, zusammenrechnet, und das Ergebnis ins Ausgabefeld setzt. Mit entsprechender Berücksichtigung des Falls, dass eine oder beide der Eingaben ungültig sind. Am einfachsten wäre eine Schaltfläche für die Berechnung.

Edit: test.ui: http://pastebin.com/kQfXmRTG

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys

from PyQt4 import QtGui, uic


class Adder(QtGui.QApplication):
    def __init__(self, argv):
        QtGui.QApplication.__init__(self, argv)
        self.ui = uic.loadUi('test.ui')
        self.ui.calculateButton.clicked.connect(self.calculate)
        self.ui.show()

    def calculate(self):
        try:
            a_value = float(self.ui.aLineEdit.text())
            b_value = float(self.ui.bLineEdit.text())
        except ValueError:
            result = ''
        else:
            result = str(a_value + b_value)
        self.ui.resultLineEdit.setText(result)
        

def main():
    sys.exit(Adder(sys.argv).exec_())


if __name__ == '__main__':
    main()
cougartrader
User
Beiträge: 11
Registriert: Sonntag 11. August 2013, 15:12

Hallo BlackJack,

mit ganz simpel meinte ich nur, das in den Feldern 1 und 2 Werte eingetragen werden sollen, die dann im Feld 3 zusammengezählt werden.
Dies soll dann geschehen, wenn beide Felder ausgefüllt sind, am besten über einen Button. Mal sehen, wie ich das von dir verlinkte
und dein script da eingebaut bekomme.
Der verlinkte einfache Calculator funktioniert nicht, sieht gut aus, aber der Calculate Button reagiert nicht bzw. es passiert nichts...

Du hast recht, die Elemente sind absolut positioniert, das funktioniert nur dann, wenn die Fenstergröße
nicht verändert wird, aber das läßt sich wohl auch im Qt Designer anders einstellen und wäre sinnvoller, keine Frage, allerdings
ist das noch zweitrangig.

Das mit dem PyQt4.uic Modul muss ich mir mal ansehen, bisher hab ich nur etwas drüber gelesen, dass man eine .py generieren soll...

Mir geht es jetzt zunächst darum, wie ich im Designer Felder und Buttons einbaue, das klappt aber schon mal.
Auch ein Close- und Clearbutton ist kein Problem, man kann das bis hierher ja in den Eigenschaften der Signale und Slots einstellen.
Auch die Verknüpfung der beiden Buttons mit den Feldern ist noch einfach.

Ich scheitere aktuell daran, es später so ins script einzubauen, das z.B. in Feld 3 Feld 1 und 2 irgendwie berechnet werden, hier jetzt
eben mal addiert.
Das ganze soll mal komplexer werden mit ca. 20 Ergebnisfeldern, wenn ich es nun so hinbekomme, das mit einem Button eine Berechnung
in dieser bisher vorliegenden einfachsten Form ausgelöst wird,
kann man "den Rest" dann ja drum herum einbauen.

Ich werd mir dein script zu Gemüte führen und auch das verlinkte... evtl. bekomme ich das ja auf die Reihe.

LG
Holger
BlackJack

@cougartrader: Die beiden Sachen gehören zusammen. Natürlich passiert nur bei der *.ui-Datei nichts wenn man auf die „Calculate”-Schaltfläche klickt, denn dazu braucht man ja *Code*. Das Skript lädt die *.ui-Datei und verbinden die Schaltfläche mit der Methode, so dass das gewünschte passiert.
cougartrader
User
Beiträge: 11
Registriert: Sonntag 11. August 2013, 15:12

BlackJack, grad in dem Moment hab ich es so hinbekommen. Das im Designer bei der Ansicht nichts weiter
passiert außer das die Buttons funktionieren, denen man dort etwas zugewiesen hat wie z.B. clear lineA und lineB usw.
ist klar.

Aber prima, das es so nun funktioniert, ich werd als nächstes versuchen, den beiden QWidgets dort eine andere Größe zu geben und
anders zu positionieren...

Vielen Dank!

LG
Holger
Antworten