Inpfad und Outpfad mit Modul verbinden

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
karou
User
Beiträge: 9
Registriert: Donnerstag 25. Juli 2019, 09:14

Hallo an alle,

ich entwickle grad meine erste GUI und muss gestehen es ist schwieriger als gedacht :oops: ! Ich hab den QT-Designer verwendet und 2 Eingabeflechen erstellt eine für den Inpfad und eine für den Outpfad.

Jetzt möchte ich, dass wenn der Start-Button gedrückt wird der Dateipfad aus dem Eingabefeld an meine Programmschnitstelle (meinem Main Modul) übergeben wird. Dann soll die im Pfad angegebne Datei bearbeitet werden. Fürs testen hab ich in der Main bis jetzt immer einen fester Pfad aufgerufen, der soll jetzt praktisch variable durch den Inpfad ersetzt werden!
Fast das gleiche Problem habe ich mit dem Outpfad! Dieser wird bis jetzt in einem Modul des Programmes festgelegt, soll aber nun Nutzerdefiniert werden.
Kennt jemand eventuell entsprechende Befehle oder Lösungsvorschläge wie man den Inpfad und Outpfad an die Module übergeben kann?

Ich hoffe es ist verständlich worauf ich hinaus will! Ich bin erstmal Dankbar für jede Hilfe, weil alles was ich bis jetzt versucht hab nicht geklappt hat.
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn du was auch immer du mit den zwei Pfaden machen willst sauber in eine Funktion kapselst, dann kannst du die aufrufen in dem Moment, wo der User zwei entsprechende Pfade angegeben hat. Hast du schon vernuenftige Funktionen fuer deine Arbeit?
karou
User
Beiträge: 9
Registriert: Donnerstag 25. Juli 2019, 09:14

Ich habe das Back-End so programmiert das du 4 Module hast die verschiedene Funktionen übernehmen und eine Main in der diese 4 Module aufgerufen und nacheinander ausgeführt werden.
Die GUI ist dann ein extra Programm das auf die mit Qt erstellte Oberflächenvorlage zurückgreift.

Ich wollte dann den Startknopf so programmieren, dass er auf die Main zugreift und diese Ausführt. Dabei soll er nicht immer die gleiche Datei analysieren, sondern eben die aus dem Inpfad. Das einziege was ich bis jetzt gemacht hab ist die Pfade in Variablen zu packen:

Code: Alles auswählen

self.__inpfad = self.ui.eingabefeld.text()
self.__outpfad = self.ui.ausgabefeld.text()
Jetzt müsste ich diese Variablen eben in das Main Modul einlesen und dann als Inpfad verwenden.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Das hört sich alles ein bißchen verquer an. Kannst Du Deinen Code posten, zumindest den Teil, wo klar wird, wie die GUI mit dem "Main" und den Modulen interagiert?

Die doppelten Unterstrichen sollten maximal einer sein. Deutsch und Englisch in einem Programm zu mischen ist schon problematisch; das in einem Namen, noch mehr.
karou
User
Beiträge: 9
Registriert: Donnerstag 25. Juli 2019, 09:14

Ich entschuldige mich für das Durcheinander! Gehör zu den Leuten die ihre Variablen Blabla nennen, sodass keiner mehr durchsieht außer mir --> ich mach das dann am Ende immer ordentlich!
Zur Zeit interagieren die GUI und die Main noch garnicht :lol:

Den ganzen Code hochzuladen wäre viel zu umfangreich. Der Grobe Aufbau und die Funktionen der Einzelteile hier mal kurz erklärt:
func_rec: geht rekursiv durch Order, sucht nach speziellen Datenbanken und speichert alle gefunden Dateipfade in einer Liste
func_database: nimmt die Liste aus func_rec, stellt einzeln eine verbindung zu den Datenbanken her, verarbeitet die Datenbank und legt ausgewählte Ergebnisse in ein Dictionary
func_save: nimmt das Dictionary, macht daraus eine Tabelle und speichert die Tabelle ab
func_main: Ruft erst func_rec auf, dann func_database usw. --> Es ist die Schnittstelle zwischen allen
mainwindow: greift auf die durch Qt designte Oberfläche zu. Derzeit funktionieren in diesem Programm eigentlich nur die Browse Button

Derzeit lese ich einen festen Datenpfad in der func_main ein:

Code: Alles auswählen

if __name__ == "__main__":
    path = r"C:\HIER_WÜRDE_DER_DATENPFAD_ANGEGEBEN_WERDEN"
    main_it = Main(path)
--> in der Funtkion Main() ist dann Praktisch der Aufruf der einzelnen Teilprogramme definiert.
Meine eigentliche Überlegung war statt des festen Pfades einfach die Variable (die ich in mainwindow definiere habe und in der der Inpfad liegt) einzufügen. Aber das hat bis jetzt nicht funktioniert.
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn main Main heisst, dann sieht das aus als ob das eine Klasse waere. Funktionen und Methoden werden in Python klein_mit_unterstrich geschrieben.

Und du solltest auch keine Variablen in der __main__-Sektion anlegen, sondern einfach eine main-Funktion aufrufen.

Last but not least bleibt es bei meinem Vorschlag: wenn du eine Funktion 'tuwas' hast, die deine eigentliche Arbeit mit zwei Pfaden macht, dann kannst du die genauso sauber aus einer GUI aus aufrufen wie aus einer main-Funktion:

Code: Alles auswählen


def tuwas(pfad_a, pfad_b):
     ... 

class MeineQtAnwendung(...):


     def button_slot(self):
            tuwas(self._pfad_a_text_widget.text(), ...)
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Namen sollten von Anfang an aussagekräftig sein. Denn gute Namen braucht man, um das Problem richtig zu verstehen und korrekt die Lösung umzusetzen.
Eine Funktion mit dem Präfix `func_` zu versehen ist dann auch unsinnig, weil es klar ist, dass es sich um eine Funktion handelt, wenn man sie aufruft.
›func_rec‹ -> ›search_databases‹, ›func_database‹ -> ›read_databases‹ ›func_save‹ -> ›write_results‹, etc.
Und das sind jetzt auch keine unabhängigen Module, sondern das baut ja alles aufeinander auf.

Wenn man Ordner durchsucht, benutzt man Path.rglob, Rekursion versucht man in Python so weit wie möglich zu vermeiden.

Wo hast Du denn ein konkretes Problem, einen Pfad als Parameter einer Funktion zu übergeben? Code? Fehlermeldung? Traceback?
karou
User
Beiträge: 9
Registriert: Donnerstag 25. Juli 2019, 09:14

Main() ist eine Klasse
Ja ich bin leider kein Programmierer sondern bring mir alles selber bei, deswegen leidet die richtige Beschriftung manchmal
Ich hab allgemein das Problem das ich nicht weis welchen Code ich verwenden soll/ wie ich die Verbindung von GUI zu Programm schaffe

Erstmal Danke für die Hinweise ich werds weiter probieren
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@karou: `Main` sollte dann keine Klasse sein denn Du benutzt das ja wie eine Funktion. Die `__init__()` sollte ein Objekt initialisieren und dann zum Aufrufer zurückkehren, damit der etwas sinnvolles mit dem Objekt machen kann. Dein Code sieht aber so aus als würde durch den Aufruf von `__init__()` das gesamte Programm ablaufen und wenn die `__init__()` fertig ist, dann ist auch das gesamte Programm am Ende. Das sieht falsch aus.

Zum `func_`-Präfix noch: Funktionen und Methodennamen beschreiben üblicherweise die Tätigkeit die von der Funktion/Methode ausgeführt wird. Damit kann man sie auch von ”passiven” Werten unterscheiden ohne einen künstlichen Namenspräfix einführen zu müssen.

Wie man aus einer GUI heraus eine Funktion mit Werten aus der GUI aufruft, hat __deets__ in seinem Beitrag doch gezeigt. Wenn der Rückruf für die Schaltfläche von der GUI-Hauptschleife aufgerufen wird, muss dort Code stehen der die Werte für den Aufruf aus der GUI holt und damit dann die Funktion aufruft. Eventuell gehört da noch Code rein der die Benutzereingabe überprüft, also zum Beispiel das auch für beide Pfade etwas ausgesucht wurde vom Benutzer.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten