Globale Objekte

Fragen zu Tkinter.
Antworten
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Globale Objekte

Hallo Python & Tkinter Anwender

Ich habe eine Frage betreffs globale Objekte.
Um meine Frage zu visualisieren habe ich ein
Test-Skript zusammengestellt. Bei diesem Skript
müssen die Funktionsaufrufe mittels ausdokumen-
tieren einzeln getestet werden um zu sehen was
gemeint ist.

Zurück zur Frage.
Warum ergibt die Funktion1 folgende Fehlermeldung:
local variable 'perle' referenced before assignment

Interessanterweise geht es mit Funktion2 beim Einsatz
der Anweisung global perle ohne diese Fehlermeldung.

Mit der Funktion3 funktioniert es sogar ohne die
die Anweisung global perle.

Warum müssen die Objekte: cv,x1,y1,x2,y2 in den
Funktionen nicht als global deklariert werden?

Sorry für meine evt. dumme Frage. (Nobody ist perfekt!)

Code: Alles auswählen

from Tkinter import *

def Funktion1():
	cv.delete(perle)
	perle = cv.create_oval(x1,y1,x2,y2,fill='green',outline='black')

def Funktion2():
	global perle
	cv.delete(perle)
	perle = cv.create_oval(x1,y1,x2,y2,fill='green',outline='black')

def Funktion3():
	try:
		cv.delete(perle)
	except:
		pass
	perle = cv.create_oval(x1,y1,x2,y2,fill='green',outline='black')


if __name__ == '__main__':

	root = Tk()
	root.title("Globale-29.01.04-22:30")
	root['bg'] = 'steelblue3'

	#~~ Erzeugt Canvasfläche für die Aufnahme von Canvas-Objekten
	cv = Canvas(root,height=430,width=450,bd=2,relief=RAISED,bg='khaki2')
	cv.pack()

	x1 = 100
	y1 = 100
	x2 = 200
	y2 = 200

	perle = cv.create_oval(x1,y1,x2,y2,fill='green',outline='black')

	Funktion1()
#	Funktion2()
#	Funktion3()

	root.mainloop()
Gruss wuf :?:
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

wuf hat geschrieben:Globale Objekte

Hallo Python & Tkinter Anwender
Hi wuf,
wuf hat geschrieben:Ich habe eine Frage betreffs globale Objekte.
Um meine Frage zu visualisieren habe ich ein
Test-Skript zusammengestellt. Bei diesem Skript
müssen die Funktionsaufrufe mittels ausdokumen-
tieren einzeln getestet werden um zu sehen was
gemeint ist.
schön wenns code zu durchstöbern gibt :)
wuf hat geschrieben:Zurück zur Frage.

Code: Alles auswählen

def Funktion1():
   cv.delete(perle)
   perle = cv.create_oval(x1,y1,x2,y2,fill='green',outline='black')
Warum ergibt die Funktion1 folgende Fehlermeldung:
local variable 'perle' referenced before assignment
ganz einfach, in dem Moment gibts keine perle, weder global noch lokal, die wiüde erst nach dem del, lokal für die Funktion erzeugt.
wuf hat geschrieben:

Code: Alles auswählen

def Funktion2():
   global perle
   cv.delete(perle)
   perle = cv.create_oval(x1,y1,x2,y2,fill='green',outline='black')
Interessanterweise geht es mit Funktion2 beim Einsatz
der Anweisung global perle ohne diese Fehlermeldung.
Mit der Anweisung global perle wird eine Varibable perle, falls sie nicht schon im globalen Namensraum existiert, angelegt.
wuf hat geschrieben:

Code: Alles auswählen

def Funktion3():
   try:
      cv.delete(perle)
      print "perle wurde deleted" #warum kommt diese Meldung nie?
   except:
      pass
   perle = cv.create_oval(x1,y1,x2,y2,fill='green',outline='black')
Mit der Funktion3 funktioniert es sogar ohne die
die Anweisung global perle.
jo klar, mit dem trx:...except: leitest Du die Ausnahmebehandlung auf den Bereich im except-Block um. Füg mal nach dem del eine Zeile print "perle deleted" ein und rufe die Funktion mehrmals auf.
wuf hat geschrieben:Warum müssen die Objekte: cv,x1,y1,x2,y2 in den
Funktionen nicht als global deklariert werden?
Du deklarierst keine Objekte als Global sondern Variablen. cv,x1,y1,x2,y2 werden hier als Parameter an eine Funktion zugewiesen, also nicht verändert und sind schon global definiert, wenn auch am Ende des Scripts.
wuf hat geschrieben:Sorry für meine evt. dumme Frage. (Nobody ist perfekt!)
Meine Antworten werfen sicher weitere Fragen auf. Und dumm bleibt nur, wer nicht fragt.
wuf hat geschrieben: Gruss wuf :?:
Gruß

Dookie
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Dookie

Danke für Deine sehr übersichtliche Antwort.
Deine Bemerkung am Ende der Antwort, dass
sicher noch weitere Fragen kommen werden be-
wahrheitet sich.

Meine biologische Lampe leuchtet noch nicht
voll sie flackert nur Hi.

Ich habe mein erstes Skript auf die Funktion3
reduziert.

Mit dem Skript erzeuge ich zuerst eine grösser
grüne Perle nahe der oberen linken Ecke der
Canvasfläche.

Ich möchte mit dem weiteren Ablauf des Skripts
bewirken, dass diese grüne Perle gelöscht wird
und durch eine blaue Perle in der unteren rechten
Ecke ersetzen.

Nun habe ich nach Ablauf des Scripts aber beide
Perlen auf der Canvasfläche.

Tatsächlich bekomme ich die Rückmeldung 'Hello Baby1'
nicht. Also die grüne Perle wird effektiv nicht
glöscht.

Irgendwie Interpretiere ich diese try: except:
Anweisung falsch.

Für mich heisst sie:
Versuche die existierende grüne Perle zu löschen.
Wenn sie nicht existieren sollte, darf das Programm
nicht unterbrochen werden, also ignoriere die nicht
existierende Perle und zeichne die neue blaue Perle.

Ich habe Dir zwei Skripts.
Im ersten ist die try: except: Anweisung in der
Funktion3 untergebracht.

Im zweiten Skript habe ich die try: except: Anweisung
im Hauptprogramm ohne Funktion3 untergebracht. Das
zweite Skript macht was ich möchte. Und die Meldung
'Hello Baby2' wird zurückgeliefert.

Dookie verstehst Du was ich meine.
Ich hoffe es sind bei mir noch nicht die ersten
Anzeichen eines Demenz-Leiden Hi.

Skript-1 mit Funktion3:

Code: Alles auswählen

from Tkinter import *

def Funktion3():
	try:
		cv.delete(perle)
		print "Hello-Baby1"
	except:
		pass
	perle = cv.create_oval(x1+200,
						   y1+200,
						   x2+200,
						   y2+200,
						   fill='steelblue',
						   outline='black')

if __name__ == '__main__':

	root = Tk()
	root.title("Perle-1")
	root['bg'] = 'steelblue3'

	#~~ Erzeugt Canvasfläche für die Aufnahme von Canvas-Objekten
	cv = Canvas(root,height=430,width=450,bd=2,relief=RAISED,bg='khaki2')
	cv.pack()

	x1 = 20
	y1 = 20
	x2 = 220
	y2 = 220

	#~~ Erzeugt auf der Canvasfläche eine grüne Perle
	perle = cv.create_oval(x1,
						   y1,
						   x2,
						   y2,
						   fill='green',
						   outline='black')

	Funktion3()

	root.mainloop()
Skript-2 Hauptprogramm

Code: Alles auswählen

from Tkinter import *

if __name__ == '__main__':

	root = Tk()
	root.title("Perle-2")
	root['bg'] = 'steelblue3'

	#~~ Erzeugt Canvasfläche für die Aufnahme von Canvas-Objekten
	cv = Canvas(root,height=430,width=450,bd=2,relief=RAISED,bg='khaki2')
	cv.pack()

	x1 = 20
	y1 = 20
	x2 = 220
	y2 = 220

	#~~ Erzeugt auf der Canvasfläche eine grüne Perle
	perle = cv.create_oval(x1,
						   y1,
						   x2,
						   y2,
						   fill='green',
						   outline='black')

	try:
		cv.delete(perle)
		print 'Hello Baby2'
	except:
		pass

	perle = cv.create_oval(x1+200,
						   y1+200,
						   x2+200,
						   y2+200,
						   fill='steelblue',
						   outline='black')

	root.mainloop()
Gruss wuf :)
Take it easy Mates!
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Hallo!
wuf hat geschrieben:Irgendwie Interpretiere ich diese try: except:
Anweisung falsch.

Für mich heisst sie:
Versuche die existierende grüne Perle zu löschen.
Wenn sie nicht existieren sollte, darf das Programm
nicht unterbrochen werden,
canvas.delete() verursacht nie eine Exception. Wenns nichts zu löschen gibt, passiert auch nichts besonderes.

Das Problem hat Dookie ja bereits erläutert und zwar für die Funktion Funktion1(), die ja ein Fehler enthält, den Zugriff auf eine lokale Variable, die es nicht gibt. Funktion3() enthält natürlich den gleichen Fehler, nur dass Du mit dem try/except die Ausgabe des Fehlers unterdrückt hast. Abhilfe: global perle
Jan
Antworten