Seite 1 von 1

Zugriff auf Funktionen/Variablen anderer Methoden

Verfasst: Montag 14. Juli 2003, 16:05
von lbuega
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...

Re: Zugriff auf Funktionen/Variablen anderer Methoden

Verfasst: Montag 14. Juli 2003, 16:31
von Voges
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

Verfasst: Montag 14. Juli 2003, 22:21
von alpha
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

Verfasst: Mittwoch 16. Juli 2003, 13:17
von lbuega
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 ? :(

Verfasst: Mittwoch 16. Juli 2003, 14:54
von Voges
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

Verfasst: Mittwoch 16. Juli 2003, 15:30
von Dookie
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

referenz

Verfasst: Donnerstag 17. Juli 2003, 05:54
von alpha
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

Verfasst: Donnerstag 17. Juli 2003, 16:21
von lbuega
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...

Verfasst: Donnerstag 17. Juli 2003, 19:27
von Dookie
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