Kann man diesen Code vereinfachen?

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
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Samstag 5. Oktober 2002, 14:29

Daß mit dem Lesen der Configdatei haben wir ja nun geschafft. Aber irgendwie bekomme ich Blasen an die Finger. Sehen wir uns zuerst den Code an:

Code: Alles auswählen

    ## checkBoxes
    self.cbVerify.setChecked(config.getboolean('Options', 'Verify'))
    self.cbTotals.setChecked(config.getboolean('Options', 'Totals'))
    self.cbVersion.setChecked(config.getboolean('Options', 'Version'))
    self.cbReadFullBlocks.setChecked(config.getboolean('Options', 'ReadFullBlocks'))
    self.cbIgnoreFailedRead.setChecked(config.getboolean('Options', 'IgnoreFailedRead'))
    self.cbIgnoreZeros.setChecked(config.getboolean('Options', 'IgnoreZeros'))
    self.cbMultiVolume.setChecked(config.getboolean('Options', 'MultiVolume'))
    self.cbCheckPoint.setChecked(config.getboolean('Options', 'CheckPoint'))
    self.cbKeepOldFiles.setChecked(config.getboolean('Options', 'KeepOldFiles'))
    self.cbModificationTime.setChecked(config.getboolean('Options', 'ModificationTime'))
Wie wir sehen, sind in den Variablen / Objekten immer Namensverwandschaften. Kann man nicht eine Liste wie

Code: Alles auswählen

check_boxes=[Verify, Totals, Version,.....]
mit weiner for Schleife verwenden und dann die Namen eintragen lassen?

Es gibt ja nicht nur eine Lese sondern auch eine Schreibroutine. Bin mittlerweile bei 1000 Zeilen Code für die Applikation (ohne GUI).

Hans
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Samstag 5. Oktober 2002, 15:45

Hallo!
hans hat geschrieben: Wie wir sehen, sind in den Variablen / Objekten immer Namensverwandschaften. Kann man nicht eine Liste wie

Code: Alles auswählen

check_boxes=[Verify, Totals, Version,.....]
mit weiner for Schleife verwenden und dann die Namen eintragen lassen?
Ich würde es wohl mit einem Dictionary machen.

Code: Alles auswählen

self.dictCB = {}
self.dictCB['Verify'] = ... # Checkbox erzeugen
self.dictCB['Totals'] = ... # Checkbox erzeugen
self.dictCB['Version'] = ... # Checkbox erzeugen
self.dictCB['ReadFullBlocks'] = ... # Checkbox erzeugen

for key in self.dictCB.keys():
    self.dictCB[key].setChecked(config.getboolean('Options',key))
Ich weiß nicht, wie die Checkboxen erzeugt werden. U. U. könnte man das auch in einer Schleife erledigen. Und wenn Du 'Options' auch variabel haben möchtest, kann Du als Schlüssel auch Tupel verwenden, also self.dictCB[('Options','Totals')] = ...

Jan
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Samstag 5. Oktober 2002, 17:27

Also die Oberfläche habe ich mit dem QT Designer erstellt. pyuic had daraus dann py Code gemacht. Ich wollte eigentlich die Oberfläche nicht mit dem vi erstellen.

Kann ich die bestehenden Checkboxen, LineEditoren, etc nicht mit einer Referenz in die Liste übernehmen.

Du wirst es nicht glauben, ich wende meinen Blick nach rechts in eines der vielen aufgeschlagenen Bücher, und was sehe ich) die Inlinefunktion getattrib(object, name [,default].

Das riecht danach, als wenn das in der Richtung was brauchbares wäre. Werde ich wohl morgen mal untersuchen müssen.

Hans
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Samstag 5. Oktober 2002, 18:18

Hallo!
hans hat geschrieben: Kann ich die bestehenden Checkboxen, LineEditoren, etc nicht mit einer Referenz in die Liste übernehmen.
Sollte kein Problem sein, die vom Designer erzeugten Referenzen umzukopieren (egal ob Liste oder Dict):
self.dictCB = {}
self.dictCB['Verify'] = self.cbVerify
self.dictCB['Totals'] = self.cbTotals

Jetzt zeigt self.dictCB['Verify'] und self.cbVerify auf die selbe Checkbox.

Jan
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Samstag 5. Oktober 2002, 22:52

Hi Jan

das ist eine Möglichkeit. Was bleibt ist, das für jedes Element zwei Diconaryeinträge erstellt werden müssen.

Darüber hinaus habe ich mir mal getattr() angeschaut. Das ist genau das was ich brauche. Damit kannst du von einem Text ermitteln, ob es ein Objekt gleichen Namens gibt. Schau die mal das Beispiel (NorAttr) auf http://python.normann-live.de an.

Super einfach.

Hans
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Sonntag 6. Oktober 2002, 10:39

hans hat geschrieben:Hi Jan
das ist eine Möglichkeit. Was bleibt ist, das für jedes Element zwei Diconaryeinträge erstellt werden müssen.
Zwei?
Darüber hinaus habe ich mir mal getattr() angeschaut. Das ist genau das was ich brauche. Damit kannst du von einem Text ermitteln, ob es ein Objekt gleichen Namens gibt. Schau die mal das Beispiel (NorAttr) auf http://python.normann-live.de an.
Hab' ich mir angeschaut. Sieht gut aus. Bei meiner Dict-Lösung ist die Ertstellung des Dictionaries etwas aufwändiger (geschieht aber eh nur einmal), dafür finde ich den Code beim Zugriff auf die Controls etwas lesbarer. Ich habe allerdings auf die null-Prüfung verzichtet.

Code: Alles auswählen

class Tutor(TNorAttr):
    def __init__(self, parent = None, name = None, fl = 0):
        TNorAttr.__init__(self,parent,name,fl)
        self.editFields = {'edField1':self.edField1, 'edField2':self.edField2, 'edField3':self.edField3}
        print self.editFields

    def On_btOKClicked(self):
         for field in self.editFields.keys():
              self.editFields[field].setText(field)
Völlig ungetestet. Ich hab' kein Qt.
BTW: Die Screenshot sehen Klasse aus. Da kommen meine TKinter-Sachen nicht mit.

Jan
Antworten