vom Unterprogramm auf Hauptprogramm zu greifen

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
philipppython
User
Beiträge: 2
Registriert: Sonntag 11. Dezember 2022, 12:46

ich habe ein Hauptprogramm "v1_gui.py" und greife damit auf mein Unterprogramm "v1_order_schleife.py" , dadurch dass ich das unterprogramm ins hauptprogramm importiere.
Wie kann ich nun auch vom Unterprogramm grundsätzlich eine Funktion im Hauptprogramm aufrufen? wenn ich das Hauptprogramm im Unterpgromm importiere, kommt die Fehlermeldung
"AttributeError: partially initialized module 'v1_order_schleife' has no attribute 'verbinden' (most likely due to a circular import)". Als der Button soll grün werden, sobald connected...
Leider bin ich auch nach 2 Stunden recherche auf keine Lösung gekommen... wäre super wenn mir jemand helfen könnte. Danke.
hier der code:

"v2_gui.py:"
from tkinter import *
from ib_insync import *
import v1_order_schleife

window = Tk()
window.title("Bot")
window.geometry("500x500") #Fenstergröße


def ausloesenundordern():
strike = int(eingabefeld_strike.get())
kurs = float(eingabefeld_kurs.get())
anzahl = int(eingabefeld_anzahl.get())
v1_order_schleife.orderschleifeplatzieren(strike, kurs, anzahl)

k_knopf = Button(text='not connected', bg='red', command=v1_order_schleife.verbinden)
ok_knopf.grid(row=0, column=0)


"v1_oder_schliefe.py":

from ib_insync import *
import numpy as np
import v1_gui


def verbinden():

global ib
ib = IB()
ib.connect('127.0.0.1', 7497, clientId=1)
if ib.client.isReady():
print("connected")
ok_knopf.configure(text='connected', bg='green')
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

Nach einem ersten Blick auf den Code:

*-Importe sind böse. Du kannst nicht nachvollziehen, welche Namen du dir da in den Namensraum holst. Bei tk sind das xhundert. Die Wahrscheinlichkeit für Kollisionen ist also recht groß. Gängig ist bei tk zum Beispiel ein "import tkinter as tk". Den Rest musst du auch entsprechend umstellen.

Vergiss, dass es global gibt.
Verwende keine globalen Variablen.
Alles, was eine Funktion benötigt, bekommt sie über Parameter und gibt das Ergebnis mit return zurück.
Es gibt also keine Notwendigkeit für globale Variablen.
Ich sehe in deinem Programm keine einzige Funktion, die Parameter verwendet und kein return. Ein deutliches Anzeichen, dass du dir anschauen musst, wie Funktionen eigentlich funktionieren. Das ist auch wichtig, weil jedes halbwegs komplexe GUI-Programm Objektorientierte Programmierung benötigt. Und die wirst du nicht verstehen, bevor du nicht Funktionen verstanden hast.

Auf Modulebene (also uneingerückt) stehen ausschließlich die Shebang, Importe, die Definitionen von Klassen und Funktionen, Konstanten (die heißen so, weil sie sich nie ändern) und der berühmte, gleich folgende Einstiegspunkt. Dein Programm beginnt dann in der Funktion main():

Code: Alles auswählen

if __name__ == "__main__":
    main()
Zu deiner eigentlichen Frage:
Was du versuchst geht nicht - wie der Fehler ja auch sagt.
Es gibt auch keine "Unterprogramme". Oder zumindest ist das nicht, das was du da hast. Du hast Module. Und wenn Module gegenseitig voneinander abhängen, dann stimmt etwas grundsätzliches nicht. Deine Aufteilung ist also grober Murks.

Und last but not least: Wenn du Code hier im Forum postest, dann setze ihn in Code-Tags. Wie du siehst, geht sonst die Einrückung verloren und die ist bei Python fundamental wichtig. Die Code-Tags werden automatisch eingefügt, wenn du den </> Button im "vollständigen Editor" drückst.
philipppython
User
Beiträge: 2
Registriert: Sonntag 11. Dezember 2022, 12:46

danke, habe jetzt zwar keine Lösung aber glaub verstanden wo ich ansetzen muss:-) programmiere erst seit 2 Wochen....
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

Na doch.
Die Lösung ist, dass das alles in ein Modul gehört.
Oder so aufgeteilt sein muss, dass eben keine Abhängigkeiten in beide Richtungen bestehen.

Überhaupt sollte man "Logik" und Oberfläche trennen.
Deine Oberfläche ruft eine Funktion auf und verarbeitet den Rückgabewert. Wo wir wieder bei Funktionen wären, die du dir anschauen musst.
Antworten