PyQt- smart window

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
malikno
User
Beiträge: 26
Registriert: Sonntag 10. April 2011, 21:47

hallo,
hoffe jemand kann mir helfen.

ich bin kein gui profi und hab bisher noch nie irgendwo eine erfahrung diesbezüglich sammeln können. ich habe nun mal so rumprobiert. wollte eigntlich nur folgendes erreichen. aus einem fenster aus, öffne ich ein zweites. dieses beinhaltet 2 line edits und ein label. in die line edits möchte ich nun jeweils zwei zahlen eingeben. im label soll immer sogleich die summe "dynamisch" angezeigt werden. d. h. bei jedem zahlen update, egal bei welchem der beiden line edits soll sogleich die summe überprüft werden können. hoffe ihr versteht mich.
hier mein code. vergesst hierbei, das auch werte an das übergeordnete fenster übergeben werden. das ist hier nicht wichtig. das endziel soll dann sein, dass jedesmal wenn die summe 1 im label ("Sum") erscheint, auch der OK button ausgelöst werden kann, ansonsten soll dieser grau hinterlegt werden. das hab ich jedoch noch nicht rein programmiert. ich glaube mein code funktioniert so weit, aber das problem ist, das er mir beim label keine zahlenwerte anzeigt.

Code: Alles auswählen

class SetWindowDlg(QDialog, ui_fluegasDlg.Ui_fluegasDlg):

    def __init__(self, callback, parent=None):
        super(SetWindowDlg, self).__init__(parent)
        
        widthLabel = QLabel("&Width:")
        lengthLabel = QLabel("Length")
        sumLabel = QLabel("Sum")
        
        self.widthlineedit = QLineEdit("0")
        self.lengthlineedit = QLineEdit("0")
        self.sumAnzeige = QLabel("str(self.widthlineedit+self.lengthedit)")
        widthLabel.setBuddy(self.widthlineedit)
        self.widthlineedit.setAlignment(Qt.AlignRight|Qt.AlignVCenter)
        self.lengthlineedit.setAlignment(Qt.AlignRight|Qt.AlignVCenter)
        self.sumAnzeige.setAlignment(Qt.AlignRight|Qt.AlignVCenter)
 
        okButton = QPushButton("OK")
        cancelButton = QPushButton("Cancel")

        buttonLayout = QHBoxLayout()
        buttonLayout.addStretch()
        buttonLayout.addWidget(okButton)
        buttonLayout.addWidget(cancelButton)
        layout = QGridLayout()
        layout.addWidget(widthLabel, 0, 0)
        layout.addWidget(lengthLabel, 1,0)
        layout.addWidget(self.widthlineedit, 0, 1)
        layout.addWidget(self.lengthlineedit, 1,1)
        layout.addWidget(sumLabel, 2,0)        
        layout.addLayout(buttonLayout, 3, 0, 1, 3)
        self.setLayout(layout)

        self.connect(okButton, SIGNAL("clicked()"),
                     self, SLOT("accept()"))
        self.connect(cancelButton, SIGNAL("clicked()"),
                     self, SLOT("reject()"))
                     
        self.connect(self.widthlineedit,
                     SIGNAL("textEdited(QString)"), self.checkAndFix)
        self.connect(self.lengthlineedit,
                     SIGNAL("textEdited(QString)"), self.checkAndFix)
                
        self.setWindowTitle("test window2")
        
        
        
    def checkAndFix(self):
        
        try:            
            if float(self.widthlineedit) and float(self.lengthlineedit):
                self.widthlineedit = float(self.widthlineedit)
                self.lengthedit = float(self.lengthedit)
                
                sum = str(self.widthlineedit+self.lengthlineedit)
                               
                self.sumAnzeige.setText("sum") 
                     
        except:
            self.sumAnzeige.setText("Width = no conversation possible<br>")    
            
        
class Form(QDialog):

    def __init__(self, parent=None):
        super(Form, self).__init__(parent)
       
        self.width = 8.0  
        
       
        invokeButton = QPushButton("invoke flue gas widget")
        self.label = QLabel("it is just to define a label")
        

        layout = QVBoxLayout()
        
        layout.addWidget(invokeButton)
        layout.addWidget(self.label)
        self.setLayout(layout)

        self.connect(invokeButton, SIGNAL("clicked()"),
                     self.setnewwidget)
        self.setWindowTitle("test")
        self.updateUi()
        self.updateData()

    
    def updateUi(self): #how to convert unicode into float numbers
        try:            
            if float(self.width):
                self.width = float(self.width)
        except:
            self.label.setText("Width = no conversation possible<br>")

    def updateData(self):
        self.label.setText("Width = %s<br>" % (self.width))

    def setnewwidget(self):
        dialog = SetWindowDlg(self)
        dialog.widthlineedit.text()   
        
        if dialog.exec_():
            self.width = dialog.widthlineedit.text()
            self.updateData()
            self.updateUi()    


app = QApplication(sys.argv)
form = Form()
form.show()
app.exec_()
lg martin
Zuletzt geändert von malikno am Mittwoch 20. April 2011, 13:13, insgesamt 1-mal geändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Setz das doch bitte in Python-Code-Tags, so kann das ja keiner lesen oder ausführen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

@malikno: ``try``/``except`` ohne konkrete Ausnahme ist keine gute Idee. Damit verschluckst Du *alle* Ausnahmen, zum Beispiel auch einen `NameError` falls Du Dich bei einem Namen vertippt hättest. So sind Fehler schwer zu finden.

Ansonsten platziere doch einfach mal ein paar ``print``\s, damit Du siehst was ausgeführt wird und was nicht. In diesem Fall ist es auch hilfreich sich mal die Werte ausgeben zu lassen. Zum Beispiel was Du da eigentlich versuchst in ein `float()` umzuwandeln. Wenn Du Dir das mal ausgeben lässt, sollte klar sein warum das nicht geht.
malikno
User
Beiträge: 26
Registriert: Sonntag 10. April 2011, 21:47

danke erstmal für deine antwort. da ich neu bin, scheinen meine fragen wahrscheinlich für euch manchmal ein wenig dumm :) also, das was ich möchte ist eigentlich nur eine QLineEdit eingabefeld, in welchem der user eine zahl eingeben sollte. diese zahl sollte anschließend verwendet werden um eine rechenoperation auszuführen, wenn der user einen text eingibt, soll eine fehlermeldung oder was auch immer erscheinen. nun ist meine frage eigntlich nur, wie kann ich am besten das im programmcode umsetzen. ich dachte der text sollte in einem try block in eine float zahl umgewandelt werden bzw. auch die rechenoperationen durchgeführt werden, und wenn das nicht gehen sollte dann soll er eine fehlermeldung (except) ausspucken.

hättest du eine bessere idee?

lg martin
Rekrul
User
Beiträge: 78
Registriert: Dienstag 7. Dezember 2010, 16:23

Wenn du einen Fehler abfängst und dann unabhängig von diesem Fehler einfach nur eine Ausgabe 'ausspuckst', dann weisst du zwar, dass ein Fehler aufgetreten ist, aber nicht wieso der Fehler aufgetreten ist. Eine simple Möglichkeit dir den Fehler ausgeben zu lassen ist:

Code: Alles auswählen

try:
    ...
except Exception as e:
    QtGui.QMessageBox.critical(self, 'Fehler', str(e) + ' --> Konnte Summe nicht berechnen.')
Zu deiner Exception: Du versuchst einen QLineEdit zu konvertieren und nicht den Inhalt. Das kann natürlich nicht funktionieren.
malikno
User
Beiträge: 26
Registriert: Sonntag 10. April 2011, 21:47

vielen dank, das hat mir sehr geholfen. jetzt ist alles klar :)

lg
Antworten