Seite 1 von 1

Erstellen von pushButtons aus .xml heraus

Verfasst: Mittwoch 5. August 2020, 20:27
von MarcS
Hallo Zusammen,

ich bin momentan dabei ein Programm zu schreiben, bei dem man Werte für ein Pen&Paper Rollenspiel steigern kann, welche aus einer .xml Datei gelesen werden und danach auch wieder darin gespeichert werden. Dafür nutze ich PyQt5 und xml.minidom.

Erster Auschnitt des Codes: (Für mein Problem wahrscheinlich nicht allzu wichtig)

Code: Alles auswählen

fd = QFileDialog()
        HeroOpen = fd.getOpenFileName(self, 'Datei öffnen', 'Helden', '.xml (*.xml)')
        if HeroOpen[0]:
            HeroOpen = str(HeroOpen[0])
            Helden = minidom.parse(HeroOpen)
            Eigenschaft = Helden.getElementsByTagName("eigenschaft")
            for c in Eigenschaft:
                name = c.getAttribute("name")
                wert = c.getAttribute("value")
                global Eigenschaftsnamen
                Eigenschaftsnamen= Eigenschaftsnamen +[name]
                global Eigenschaftswerte
                Eigenschaftswerte= Eigenschaftswerte+[wert]
                print(Eigenschaftsnamen)
                print(len(Eigenschaftsnamen))
Im folgendem möchte ich gerne meine PushButtons erstellen. Da ich aber später nochmal auf meine Buttons zugreifen muss und die Anzahl der Eigenschaften nicht fest ist, möchte ich z ("eigenschaft_"+ n) als Button-Namen definieren. In meinem jetzigen Beispiel heißt immer der letzte Button "z".

Code: Alles auswählen

           
            for n in range(len(Eigenschaftsnamen)):
                y= Eigenschaftsnamen[n]
                z= 'eigenschaft_'+str(n)
                self.z = QtWidgets.QPushButton(self.tab_2)
                self.z.setMinimumSize(QtCore.QSize(100, 28))
                self.z.setText(str(y + ': ' + Eigenschaftswerte[n]))
                self.verticalLayout.addWidget(self.z)
Wie kann ich meine Buttons ("eigenschaft_"+ n) nennen? Ich habe viel herumprobiert und gesucht, aber letztendlich nichts brauchbares dafür gefunden. Leider bin ich noch blutiger Anfänger, weswegen ich noch nicht so viel Ahnung habe. Ich hoffe ihr könnt mir helfen.

Re: Erstellen von pushButtons aus .xml heraus

Verfasst: Donnerstag 6. August 2020, 06:11
von Sirius3
Statt xml.minidom benutzte xml.etree ElementTreen da es die schönere API hat. Variablennamen werden komplett klein geschrieben. HeroOpen ist erst ein Tupel aus Dateiname und Typ, später nur der Dateiname. Für beides ist der Name verwirrend, und man sollte nicht verschiedene Dinge an den selben Namen binden. Wäre der Name gute gewählt, z.B. dateiname, würde auch gleich auffallen, dass er im ersten Fall gar nicht passt.
`Eigenschaft` ist in Wirklichkeit `eigenschaften`, also eine Liste mit mehreren davon. Dann kannst du auch in der for-Schleife das nichtssagende c durch `eigenschaft` ersetzen.
Vergiss gleich wieder, dass es global überhaupt gibt, statt dessen benutzt du ja eine Klasse. Listenelemente hängt man mit append an. Du machst aber eine Kopie der ganzen Liste, nur um sie um ein Element zu erweitern. Zusammengehörende Dinge sollten zusammen bleiben, du hast separate Listen für Name und Wert. Benutze Tupel statt dessen.
Über einen Index iteriert man nicht. Als du noch zwei Listen hattest, hättest du zip benutzt, mit nur einer Liste ist alles viel einfacher.
Statt sich Attribute selbst zusammenzubauen benutzt man einfach ein Wörterbuch.

Code: Alles auswählen

            self.eigenschaftsknöpfe = {}
            for name, wert in self.eigenschaften:
                button = QtWidgets.QPushButton(self.tab_2)
                button.setMinimumSize(QtCore.QSize(100, 28))
                button.setText(f"{name}: {wert}")
                self.verticalLayout.addWidget(button)
                self.eigenschaftsknöpfe.append(button)

Re: Erstellen von pushButtons aus .xml heraus

Verfasst: Donnerstag 6. August 2020, 07:32
von Sirius3
Hier noch der erste Teil:

Code: Alles auswählen

from xml.etree.ElementTree import ElementTree

[...]
filename, _ = QFileDialog.getOpenFileName(self, 'Datei öffnen', 'Helden', '.xml (*.xml)')
if not filename:
    # Abbruch
    return
self.eigenschaften = []
helden = ElementTree(file=filename)
for eigenschaft in helden.findall('.//eigenschaft'):
    self.eigenschaften.append((eigenschaft.attrib['name'], eigenschaft.attrib['value']))

Re: Erstellen von pushButtons aus .xml heraus

Verfasst: Donnerstag 6. August 2020, 20:32
von MarcS
Super, danke hat mir sehr viel geholfen :)