Ich hab folgendes Problem:
allgemein geschildert:
In Modul A importiere ich Modul B.
Modul A hat u.a. die Variable V.
Modul B hat u.a. die Funktion F.
Modul A ruft die Funktion F vom Modul B auf, die die Variable V im Modul A ändern soll ==> Zugriff auf V nicht möglich; ist im Modul B immer unbekannt.
Ich möchte dies für meine GUI. In B sind meine Funktionen. Bei einem Aufruf der GUI (Modul A) soll eben die Aufgerufene Funktion F ausgeführt werden und gleichzeitig die Textvariable (V) meines Labels in Modul A geändert werden. Der Funktionsaufruf und -ausführung klappt soweit tadellos, bis eben auf den "Rückgriff" von B auf A.
Ich hoffe ich habs soweit halbwegs verständlich schildern können...
Zugriff auf Funktionen/Variablen anderer Methoden
Wie sieht denn F() aus?
Ich würd' einfach V als Argument übergeben, und geändert zurückgeben:
Jan
Ich würd' einfach V als Argument übergeben, und geändert zurückgeben:
Code: Alles auswählen
import B
V = B.F(V)
Ich hätte da folgende Idee. Wenn Du Modul B eine Kopie der Instanz von Modul A (sofern es eine Klasse ist) übergibst könnte es funktionieren. Wichtig ist nur, daß Du nur eine zweite Referenz auf das Objekt erzeugst (Modul A) und keine tiefe Kopie. Sonst wird ein zweites Objekt angelegt, dessen Eigenschaften sich nicht ändern, wenn Du Sie im Modul A änderst.
alpha
alpha
mmh, beides gute Vorschläge! Aber da ich im Funktionsaufruf schon eingeschränkt bin (ist an ein Menü gebunden) funktioniert's leider nicht. @alpha: Wie bekomme ich "nur" eine Referenz-Kopie hin?
in Kurzform:
und hier dann Modul B:
Wie krieg ich da nun den Bogen zur Statusbar in Modul A ?
in Kurzform:
Code: Alles auswählen
#um beim Eingangsbeispiel zu bleiben: Modul A
import tkinter, B
root = Tk()
#[...] Menüaufbau...
self.menuTool.add_comm(label=_('was_auch_immer'), command=B.F)
#[...] weiter Menüstruktur + progammcode
Statusbar = Label(root, text="Hallo", relief=SUNKEN)
Statusbar.pack(side=BOTTOM)
root.mainloop()
Code: Alles auswählen
#Modul B
#[...] viele Funktionen...
def F():
#[...] mache dies und das...
#Und hier nun mein Problemkind:
Statusbar["text"]= "... wurde erfolgreich ausgeführt"
Das sieht mir aber nach 'broken by design' aus. Wenn F(), wie es aussieht, eigentlich gar nichts mit der GUI zu tun hat, sollte F() auch nichts über das die GUI wissen müssen, sondern möglichst nur zurückgeben, ob's geklappt hat oder nicht. Das Ändern des Statusbars sollte im Modul A bleiben.lbuega hat geschrieben:Wie krieg ich da nun den Bogen zur Statusbar in Modul A ?
Code: Alles auswählen
#------------------------- Modul A
...
def callF():
if B.F(): Statusbar["text"] = "... wurde erfolgreich ausgeführt"
else: Statusbar["text"] = ":-("
...
self.menuTool.add_comm(label=_('was_auch_immer'), command=callF)
#[...] weiter Menüstruktur + progammcode
...
Statusbar = Label(root, text="Hallo", relief=SUNKEN)
...
#------------------------- Modul B
def F():
#[...] mache dies und das...
# wenn erfolgreich
return 1
# sonst
return 0
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
Hallo,
noch ein Vorschlag:
Gruß
Dookie
noch ein Vorschlag:
Code: Alles auswählen
# --- Modul B ---
set_Status = None
def F():
#mach was
if set_Status:
set_Status("... wurde erfolgreich ausgeführt!"
Code: Alles auswählen
#--- Modul A ---
import tkinter, B
def my_set_Status(status_text):
statusbar["text"] = status_text
B.set_Status = my_set_Status
root = Tk()
#[...] Menüaufbau...
self.menuTool.add_comm(label=_('was_auch_immer'), command=B.F)
#[...] weiter Menüstruktur + progammcode
Statusbar = Label(root, text="Hallo", relief=SUNKEN)
Statusbar.pack(side=BOTTOM)
root.mainloop()
Dookie
Hallo Ibuega,
eine Referenz bekkommst Du indem Du einer Variablen einfach das Objekt zuweist.
z.B.:
class A:
....
X = A()
B = A
Wenn Du jetzt einen Wert in A änderst sollte er sich auch in B ändern.
Wenn Du das nicht möchtest
import copy
B = copy.deepcopy(A)
Jetzt hast Du ein unabhängiges Objekt.
Gruß
alpha
eine Referenz bekkommst Du indem Du einer Variablen einfach das Objekt zuweist.
z.B.:
class A:
....
X = A()
B = A
Wenn Du jetzt einen Wert in A änderst sollte er sich auch in B ändern.
Wenn Du das nicht möchtest
import copy
B = copy.deepcopy(A)
Jetzt hast Du ein unabhängiges Objekt.
Gruß
alpha
Stark, Ihr seid echt spitze
@Voges: JEIN, je nach F() wird ein weiteres GUI-Fenster geöffnet, auf ein Shell-Skript zugegriffen oder ein Programm gestartet. Hat also schon noch was mit der GUI zu tun. Bei Deiner Lösung mit einer separatem "callF()" könnte ich mir mein Modul B gleich sparen, da ich ja dann alles doppelt machen müsste (für jede F() ebenfalls eine callF() in Modul A). Würde meines erachtens dann kein Sinn machen, da ich das dann gleich direkt in A machen könnte - oder macht man das trotzdem zur sauberen Trennung?
@Dookie: Krass, ist das "legaler" Python Code? Habs ausprobiert und funktioniert prima - genau das was ich benötigt habe!!! Hat aber etwas gedauert bis ich das verstanden hatte. Gibts da einen Namen dafür - etwa Funktionszuweisung oder so?
@alpha:muss ich bei Gelegenheit mal noch ausprobieren...
@Voges: JEIN, je nach F() wird ein weiteres GUI-Fenster geöffnet, auf ein Shell-Skript zugegriffen oder ein Programm gestartet. Hat also schon noch was mit der GUI zu tun. Bei Deiner Lösung mit einer separatem "callF()" könnte ich mir mein Modul B gleich sparen, da ich ja dann alles doppelt machen müsste (für jede F() ebenfalls eine callF() in Modul A). Würde meines erachtens dann kein Sinn machen, da ich das dann gleich direkt in A machen könnte - oder macht man das trotzdem zur sauberen Trennung?
@Dookie: Krass, ist das "legaler" Python Code? Habs ausprobiert und funktioniert prima - genau das was ich benötigt habe!!! Hat aber etwas gedauert bis ich das verstanden hatte. Gibts da einen Namen dafür - etwa Funktionszuweisung oder so?
@alpha:muss ich bei Gelegenheit mal noch ausprobieren...
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
Hi Ibuega,
jo das ist legaler Pythoncode. Auch Funktionen sind Objekte und können Variablen zugewiesen werden. Die Eventgesteuerten GUI-Sachen würden alle ohne diese Möglichkeit nicht so elegant zu programmieren sein.
Gruß
Dookie
jo das ist legaler Pythoncode. Auch Funktionen sind Objekte und können Variablen zugewiesen werden. Die Eventgesteuerten GUI-Sachen würden alle ohne diese Möglichkeit nicht so elegant zu programmieren sein.
Gruß
Dookie