PyQt GUI-öffnen von 2. Fenster

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
ich bin gerade dabei meine erste gui zu erstellen, und habe daher nicht wirklich viel ahnung wie man das am besten machen kann. ich habe nun mal eine kleine anwendung geschrieben, wo man aus einer erstellten ersten gui oberfläche (mit qt-designer) eine zweite gui oberfläche "modal" öffnet und einen wert an die 1.te übergibt. (self.cpi)

funktionieren tut das ganze so wie ich es will. aber ich möchte mich ja gerne verbessern, und daher frage ich mal euch erfahrene python profis was für verbesserungen man da vornehmen könnte. zum beispiel bin ich mir nicht sicher eine eingabe über QLineEdit zuerst in einen unicode und anschließend in eine float zahl umzuwandeln. ich habe nur gelesen das man immer den Qstring text sobald wie möglich in unicode verwandeln. nun arbeite ich aber eigntlich anschließend gar nicht mit dem text sondern will mit den eingegebenen werten lediglich eine summe bilden die sich auf 1 ergänzt. kann man das auch gleich von QString in float umwandeln. also für verbesserungsvorschläge wär ich sehr dankbar.
hier mein code

Code: Alles auswählen

from PyQt4.QtCore import *
from PyQt4.QtGui import *

import ui_fluegasDlg_vol
import ui_OrcDlg

class Fluegas_vol(QDialog, ui_fluegasDlg_vol.Ui_fluegasDlg_vol):

    def __init__(self, parent=None):
        super(Fluegas_vol, self).__init__(parent)
        
        
        self.setupUi(self)
        if not MAC:
            self.okButton.setFocusPolicy(Qt.NoFocus)
            self.cancelButton.setFocusPolicy(Qt.NoFocus)
            
        
        self.connect(self.N2_lineedit,
                     SIGNAL("textEdited(QString)"), self.update_values)
        self.connect(self.O2_lineedit,
                     SIGNAL("textEdited(QString)"), self.update_values)    
        self.connect(self.H2_lineedit,
                     SIGNAL("textEdited(QString)"), self.update_values)    
        self.connect(self.Ar_lineedit,
                     SIGNAL("textEdited(QString)"), self.update_values)    
        self.connect(self.CH4_lineedit,
                     SIGNAL("textEdited(QString)"), self.update_values)    
        self.connect(self.CO_lineedit,
                     SIGNAL("textEdited(QString)"), self.update_values)    
        self.connect(self.CO2_lineedit,
                     SIGNAL("textEdited(QString)"), self.update_values)    
        self.connect(self.H2O_lineedit,
                     SIGNAL("textEdited(QString)"), self.update_values)    
        self.connect(self.SO_lineedit,
                     SIGNAL("textEdited(QString)"), self.update_values)    
        self.connect(self.SO2_lineedit,
                     SIGNAL("textEdited(QString)"), self.update_values)    
        self.connect(self.SO3_lineedit,
                     SIGNAL("textEdited(QString)"), self.update_values)    
        self.connect(self.H2S_lineedit,
                     SIGNAL("textEdited(QString)"), self.update_values)    
        self.connect(self.NO_lineedit,
                     SIGNAL("textEdited(QString)"), self.update_values)    
        self.connect(self.NO2_lineedit,
                     SIGNAL("textEdited(QString)"), self.update_values)    
        self.connect(self.Ne_lineedit,
                     SIGNAL("textEdited(QString)"), self.update_values)    
           
    
    def update_values(self):
        try:            
            
            text0 = unicode(self.N2_lineedit.text())
            text1 = unicode(self.O2_lineedit.text())
            text2 = unicode(self.H2_lineedit.text())
            text3 = unicode(self.Ar_lineedit.text())
            text4 = unicode(self.CH4_lineedit.text())
            text5 = unicode(self.CO_lineedit.text())
            text6 = unicode(self.CO2_lineedit.text())
            text7 = unicode(self.H2O_lineedit.text())
            text8 = unicode(self.SO_lineedit.text())
            text9 = unicode(self.SO2_lineedit.text())
            text10= unicode(self.SO3_lineedit.text())
            text11= unicode(self.H2S_lineedit.text())
            text12= unicode(self.NO_lineedit.text())
            text13= unicode(self.NO2_lineedit.text())
            text14= unicode(self.Ne_lineedit.text())
            
            text = [text0,text1,text2,text3,text4,text5,text6,text7,text8,text9,text10,text11,text12,text13,text14]
            self.sum = 0
            for i in range(len(text)):
                self.sum = self.sum + float(text[i])
            
            
            self.Sumcalculated_label.setText(str(self.sum))                  
            self.updateUi()
        except:
            self.Sumcalculated_label.setText("set correct values")    
            self.okButton.setEnabled(False)
        
    def updateUi(self):
        if round(float(unicode(self.Sumcalculated_label.text())),5) == 1.00000:
            self.okButton.setEnabled(True)
        else:    
            self.okButton.setEnabled(False)
            
            

class main_OrcDlg(QDialog,ui_OrcDlg.Ui_OrcDlg):
    
    def __init__(self, parent=None):
        super(main_OrcDlg, self).__init__(parent)
        
        self.setupUi(self)
        if not MAC:
            self.VolButton.setFocusPolicy(Qt.NoFocus)
            self.MassButton.setFocusPolicy(Qt.NoFocus)
        
        self.cpi = 0.0
                    
        self.connect(self.VolButton, SIGNAL("clicked()"),self.open_fluegasDlg_vol)
        self.updateData()
        
    def updateData(self):
        self.cpi_label.setText("cpi = %s<br>" % (self.cpi))
    
    def open_fluegasDlg_vol(self):
        fluegas_vol = Fluegas_vol(self)
    
        if fluegas_vol.exec_():
            self.cpi = fluegas_vol.N2_lineedit.text()
            self.updateData()
            
            
if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = main_OrcDlg()
    main.show()
    app.exec_()
BlackJack

@malikno: Als erstes fällt die alte `connect()`-Verwendung auf. Man kann das mittlerweile etwas kürzer und übersichtlicher schreiben:

Code: Alles auswählen

        self.connect(self.N2_lineedit,
                     SIGNAL("textEdited(QString)"), self.update_values)
        # Wird zu:
        self.N2_lineedit.textEdited.connect(self.update_values)
Dann machst Du für viele Werte immer das selbe. Das könnte man als Schleife schreiben. Insbesondere da `update_values()` auch wieder mit allen `QLineEdit`\s das selbe macht, sollte man die in eine Liste stecken um auch dort mit einer Schleife arbeiten zu können.

Das Ergebnis der Aktionen erst an durchnummerierte Namen zu binden um die dann in eine Liste zu stecken ist umständlich. Man könnte da auch gleich die Liste mit befüllen, ohne den Zwischenschritt über die nummerierten Namen.

Das nächste ist der Umweg über einen Index um die Werte auf zu summieren -- man kann in Python direkt über die Elemente einer Liste iterieren. Dazu braucht man keinen Index. In diesem speziellen Fall kann man sich die Schleife ganz sparen, weil es die `sum()`-Funktion gibt.

Werte über einen Labeltext von einer Methode zur anderen zu übertragen ist unsauber. Der Wert um den es geht, sollte als Attribut auf dem Dialog existieren -- was er als `self.sum` ja sogar tut. Das könnte man für Fälle wo die Summe nicht berechnet werden kann auf `None` setzen. Das gleiche gilt beim `main_OrcDlg`-Dialog und dem `cpi`-Attribut. Wenn das einen Zahlenwert enthalten soll, dann sollte das auch immer nur an Zahlen gebunden werden und nicht mal an Zahlen und mal an Zeichenketten.

Bei `main_OrcDlg` sehe ich ein schönes Beispiel warum man Namen nicht abkürzen sollte. Ist das die Haupt-Ork-Delegation die zu den Hobbits zum Verhandeln geschickt wird? ;-) Namen sollten dem Leser vermitteln was für eine Bedeutung das Objekt dahinter hat, möglichst ohne dass man viel rätseln muss.

Ungetestet:

Code: Alles auswählen

class Fluegas_vol(QDialog, ui_fluegasDlg_vol.Ui_fluegasDlg_vol):

    def __init__(self, parent=None):
        super(Fluegas_vol, self).__init__(parent)
        
        self.setupUi(self)
        if not MAC:
            self.okButton.setFocusPolicy(Qt.NoFocus)
            self.cancelButton.setFocusPolicy(Qt.NoFocus)
            
        self.line_edits = [
            self.N2_lineedit,
            self.O2_lineedit,
            self.H2_lineedit,
            self.Ar_lineedit,
            self.CH4_lineedit,
            self.CO_lineedit,
            self.CO2_lineedit,
            self.H2O_lineedit,
            self.SO_lineedit,
            self.SO2_lineedit,
            self.SO3_lineedit,
            self.H2S_lineedit,
            self.NO_lineedit,
            self.NO2_lineedit,
            self.Ne_lineedit,
        ]
        for line_edit in self.line_edits:
            line_edit.textEdited.connect(self.update_values)
    
    def update_values(self):
        try:
            self.sum = sum(float(unicode(le.text())) for le in self.line_edits)
            self.Sumcalculated_label.setText(str(self.sum))
            self.updateUi()
        except:
            self.Sumcalculated_label.setText('set correct values')
            self.okButton.setEnabled(False)
    
    def updateUi(self):
        self.okButton.setEnabled(round(self.sum, 5) == 1.0)
malikno
User
Beiträge: 26
Registriert: Sonntag 10. April 2011, 21:47

vielen dank für die zahlreichen tips, echt super.

lg martin
Antworten