Discussion:
[jak zdefiniować zmienną globalną]
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
Nateysz
14 lat temu
Permalink
Wiem, wiem - to pewnie banalne, ale nie mogę znaleźć rozwiązania.
Otóż chcę mieć możliwość wywołania z jednego skryptu Pythona innego
(wszystko działa pod ArcGIS-em).
Wygląda to tak, jak wartość zmiennej komunikat była czyszczona...
Skrypty wyglądają tak:

=================================================================
# Import system modules
import sys, string, os, arcgisscripting

# Create the Geoprocessor object
gp = arcgisscripting.create()
global komunikat
komunikat="wszystko wporzo"

# Load required toolboxes...
gp.AddToolbox("C:/Dokumenty i ustawienia/UserX/Dane
aplikacji/ESRI/ArcToolbox/My Toolboxes/Toolbox.tbx")


# Process: moj_wlasny...
gp.toolbox = "C:/Dokumenty i ustawienia/UserX/Dane
aplikacji/ESRI/ArcToolbox/My Toolboxes/Toolbox.tbx"
gp.Moj_wlasny()
===================================================


======================================Moj_wlasny===============
from Tkinter import *
# Import system modules
import sys, string, os, arcgisscripting

# Create the Geoprocessor object
gp = arcgisscripting.create()
#definicja klasy
class App:
#w konstruktorze umieszczamy ramkę i przycisk
def __init__(self, master):
ramka=Frame(master)
ramka.master.title("Tytul ramki")
ramka.pack(padx=70, pady=5)

#przycisk z poleceniem
self.przycisk=Button(ramka, text="Polecenie",
font=("arial",20,"bold"),command=self.wykonaj)
self.przycisk.pack()

#

#przycisk zamykający
self.przycisk2=Button(master, text="Koniec", command=root.destroy)
self.przycisk2.pack(side=BOTTOM)

#zdefiniowanie odpowiedzi
def wykonaj(self):
gp.AddMessage(komunikat)
print komunikat

#tworzenie okna głównego
root=Tk()
#tworzenie obiektu
app=App(root)
#pętla powodująca wyświetlanie okienka
root.mainloop()
=========================================================
Jan Kaliszewski
14 lat temu
Permalink
1. Jest późno (lub jak kto woli wcześnie), a ja za chwilę po x godzin
pracy idę spać, więc mogłem coś przeoczyć -- ale nie widzę żadnego
powiązania między tymi skryptami (modułami?).

2. Jeżeli są to moduły jednego programu (i np. jeden importuje drugi lub
oba są importowane przez jakiś trzeci), to nadal nic magicznie nam się
tutaj nie przeniesie. Tzw. "zmienne globalne" są w Pythonie *globalne
tylko w obrębie danego modułu* (bardziej adekwatnie można by je nazwać
zmiennymi składowymi modułu). Więc jeżeli chcesz się dostać z modułu A do
zmiennej globalnej modułu B, musisz moduł B lub konkretny obiekt siedzący
w zmiennej składowej tego modułu umieścić w zmiennej modułu A --
najczęściej uzyskuje się to za pomocą importu:

===== moduł aaa ======
komunikat = 'tralala'

===== moduł bbb ======
# moduł aaa umieszczamy w zmiennej składowej modułu bbb
import aaa
print(aaa.komunikat)

lub

===== moduł aaa ======
komunikat = 'tralala'

===== moduł bbb ======
# napis 'tralala' umieszczamy w zmiennej składowej modułu bbb
from aaa import komunikat
print(komunikat)

Warto zauważyć, że:

* w Pythonie wszystko jest obiektem, moduły również.

* każdy obiekt można umieścić w zmiennej, a raczej -- mówiąć bardziej
precyzyjnie -- przypiąć mu "etykietkę" (nazwę) w danej przestrzeni nazw;
jeden obiekt może mieć wiele takich "etykietek" (w wielu przestrzeniach
nazw, np. w różnych modułach, klasach, wewnąrz funkcji jako zmienna
lokalna itp.);

* słowo kluczowe global jest potrzebne tylko, jeżeli chcemy w nieglobalnej
przestrzeni nazw (np. wewnątrz definicji funkcji lub klasy) ustawić
wartość zmiennej globalnej.

Pozdr.
*j
Nateysz
14 lat temu
Permalink
Post by Jan Kaliszewski
===== moduł aaa ======
komunikat = 'tralala'
===== moduł bbb ======
# moduł aaa umieszczamy w zmiennej składowej modułu bbb
import aaa
print(aaa.komunikat)
lub
===== moduł aaa ======
komunikat = 'tralala'
===== moduł bbb ======
# napis 'tralala' umieszczamy w zmiennej składowej modułu bbb
from aaa import komunikat
print(komunikat)
Dziękuję za tak szybką odpowiedź...znam ten sposób odwołania - problem w
tym, że skrypt, do którego staram się odnieść jest umieszczony wśród
toolbox-ów ArcGIS-a...

Ja odwołałem się do skryptu tak:
gp = arcgisscripting.create()
gp.toolbox = "C:/Dokumenty i ustawienia/UserX/Dane
aplikacji/ESRI/ArcToolbox/My Toolboxes/Toolbox.tbx"
gp.Moj_wlasny()

Loading...