Zugriff auf Funktionen/Variablen anderer Methoden

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
lbuega
User
Beiträge: 75
Registriert: Dienstag 15. April 2003, 08:51
Wohnort: Weissach

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...
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Wie sieht denn F() aus?
Ich würd' einfach V als Argument übergeben, und geändert zurückgeben:

Code: Alles auswählen

import B
V = B.F(V)
Jan
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

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
lbuega
User
Beiträge: 75
Registriert: Dienstag 15. April 2003, 08:51
Wohnort: Weissach

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:

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()
und hier dann Modul B:

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"
Wie krieg ich da nun den Bogen zur Statusbar in Modul A ? :(
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

lbuega hat geschrieben:Wie krieg ich da nun den Bogen zur Statusbar in Modul A ? :(
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.

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
Jan
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hallo,

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()
Gruß

Dookie
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

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
lbuega
User
Beiträge: 75
Registriert: Dienstag 15. April 2003, 08:51
Wohnort: Weissach

Stark, Ihr seid echt spitze :D

@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...
Dookie
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
Antworten