In einer *.py Datei auf eine *.ui Datei zugreifen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Saturn89
User
Beiträge: 12
Registriert: Montag 27. April 2020, 20:29

Dienstag 30. Juni 2020, 12:59

Ich habe nun eine Methode erstellt in welcher ich meine Daten einlese:

Code: Alles auswählen

def ReadIn(self):
        self.material_xlsx = pd.read_excel(DATABASE, sheet_name='Material', index_col='Material')
        self.material = list(self.material_xlsx.index)
def __init__(self, parent=None):
    	self.widget = QUiLoader().load(FORM_UI_FILENAME, parent)
      	self.widget.choicebox_material.addItems(self.material)
Wie bekomme ich denn jetzt

Code: Alles auswählen

self.material
in die Methode

Code: Alles auswählen

def __init__
?

Wenn ich in der Methode

Code: Alles auswählen

def __init__
meine Daten auslesen, dann funktioniert das wunderbar, aber ich sollte ja erst alles einlesen und dann init aufrufen.

Wäre sehr nett, wenn ihr mir da nochmals helfen könnt.
Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "/home/user/xxx/main.py", line 37, in <module>
    main()
  File "/home/user/xxx/main.py", line 31, in main
    form = Form()
  File "/home/user/xxx/main.py", line 25, in __init__
    self.widget.choicebox_material.addItems(self.material)
AttributeError: 'Form' object has no attribute 'material'
Danke schon ein mal.

Grüße
Benutzeravatar
__blackjack__
User
Beiträge: 6366
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Dienstag 30. Juni 2020, 14:29

@Saturn89: Ich würde das einlesen ausserhalb der Klasse lösen und der `__init__()` die Daten als Argument(e) mitgeben.

Nach dem abarbeiten von `__init__()` sollten alle Attribute existieren. Weitere Methoden sollten nicht später noch weitere Attribute hinzufügen. Das ist unübersichtlich und fehleranfällig. Nach der `__init__()` sollte sich das Objekt in einem benutzbaren Zustand befinden.

`ReadIn()` ist von von der Schreibweise her weder Python (klein_mit_unterstrichen) noch Qt (camelCase). MixedCase, also mit grossem Anfangsbuchstaben verwenden beide für Klassen.
long long ago; /* in a galaxy far far away */
Saturn89
User
Beiträge: 12
Registriert: Montag 27. April 2020, 20:29

Dienstag 30. Juni 2020, 15:05

@__blacljack__
Vielen Dank, jetzt funktioniert es :)

Grüße und einen schönen Tag noch
Saturn89
User
Beiträge: 12
Registriert: Montag 27. April 2020, 20:29

Mittwoch 1. Juli 2020, 06:41

Guten Morgen,

muss mich leider nochmal melden. Das Programm funktioniert soweit. Nun wollte ich unter Windows auf dem Anaconda installiert ist mit Hilfe von PyInstaller eine *.exe -Datei aus erstellen.
Das Programm hat zwar noch keine Funktion, ich muss aber zeigen dass das problemlos unter Windows funktioniert, bevor ich es vollständig umsetzen kann.
Die *.exe- Datei wollte ich so erstellen

Code: Alles auswählen

pyinstaller --onefile --windowed main.py
Dann bekomme ich aber folgende Fehlermeldung:
"maximum recursion depth exceeded"

Was bedeutet dass denn?
Bei einem anderen Programm hat das Erstellen fehlerfrei geklappt.

Hier die ganze "main.py":

Code: Alles auswählen

import sys
import os
from PySide2.QtWidgets import QApplication, QWidget
from PySide2.QtCore import QFile
from PySide2.QtUiTools import QUiLoader
import pandas as pd

# Dateienpfade definieren
FORM_UI_FILENAME = os.path.join(os.path.dirname(__file__), "form.ui")
DATABASE = os.path.join(os.path.dirname(__file__), "Excel.xlsx")
# Datenbank auslesen
producer = list(["Hersteller auswählen", "HerstellerA", "HerstellerB"])
wav_typ_xlsx = pd.read_excel(DATABASE, index_col='Modell')
wav_typ = list(wav_typ_xlsx.index)
rollface_xlsx = pd.read_excel(
    DATABASE, sheet_name='Rahmenbedingungen', index_col='Oberfläche')
rollface = list(rollface_xlsx.index)
material_xlsx = pd.read_excel(
    DATABASE, sheet_name='Material', index_col='Material')
material = list(material_xlsx.index)


class Form:
    # Benutzeroberfläche einlesen und Objekte füllen
    def __init__(self, parent=None):
        self.widget = QUiLoader().load(FORM_UI_FILENAME, parent)
        self.widget.choicebox_material.addItems(material)
        self.widget.choicebox_rollface.addItems(rollface)
        self.widget.choicebox_wavtyp.addItems(wav_typ)
        self.widget.choicebox_producer.addItems(producer)
        self.widget.button_cancel.clicked.connect(self.cancel)
        self.widget.button_math.clicked.connect(self.math)

# Berechnungen definieren
    def math(self):
        pass

# Abbrechen definieren
    def cancel(self):
        sys.exit()


def main():
    app = QApplication([])
    form = Form()
    form.widget.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()
Edit: Die Excel Datei ist im gleichen Verzeichnis wie die "main.py" Datei.

Vielen Dank schon einmal
und Grüße
Antworten