Label aus einer anderen Definition zerstören

Fragen zu Tkinter.
Antworten
Noscavs
User
Beiträge: 2
Registriert: Montag 1. Februar 2010, 18:40

Hallo Leute,
ich habe nach einiger Zeit mal wieder was mit Python versucht.
Jetzt bin ich auf ein Problem gestoßen. Ich habe ein Label in einer Definition erstellt und will es in der anderen zerstören. Das Ganze sieht dann in etwa so aus:

Code: Alles auswählen

from tkinter import*

def createinterface():
    root=Tk()
    root.focus_force()
    bla=Label(root, text="blabla")
    bla.pack()
    blubb=Button(root, text="blubbblubb", command=clearwindow)
    blubb.pack()
    root.mainloop()
   
def clearwindow():
    bla.destroy()

createinterface()
Als Fehlermeldung kommt dann:
[...]line 13, in clearwindow
bla.destroy()
NameError: global name 'bla' is not defined
Entschuldigt bitte diese primitive Frage, ich muss erst wieder reinkommen.
Über Hilfe würde ich mich freuen,

lg Noscavs
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Erstmal zwei kurze Dinge vorweg: Das Ding heißt nicht "Definition" sondern Funktion. Und dann solltest du nicht "from Tkinter import *" benutzen sondern besser "import Tkinter" oder "import Tkinter as tk" und dann qualifiziert auf die Element von Tkinter zugreifen ("Tkinter.Tk()", bzw. "tk.Tk()"). Mit den *-Modulen holst du dir nur zu viele Namen und Möglicherweise Konflikte an Bord.

Zu deinem eigentlichen Problem: Python unterscheiden zwischen Verschiedenen Namensräumen. Funktionen haben immer einen eigenen Namensraum, damit sie nicht mit anderen Funktionen in Konflikt geraten. Jede Funktion sollte also möglichst wenige andere beeinflussen. Wenn du Dinge zwischen Funktionen austauschen möchtest, dann bentuze Parameter und Rückgabewerte. Bei GUIs ist das oft etwas umständlich, daher bietet sich eine Klasse dafür an:

Code: Alles auswählen

class App(object):
    def __init__(self):
        self.root = tk.Tk()
        ...
        self.bla = Label(...)
       ....

    def clear_window(self):
        self.bla.destroy()
Ein letzter Tipp noch: Lasse die Finger auf jeden Fall von "global". Das ist zwar auf den ersten Blick die einfachste Lösung, aber das Programm wird irgendwann so unüberschaubar, dass dir diese einfache Lösung nichts gebracht hat.

Sebastian
Das Leben ist wie ein Tennisball.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Noscavs

Willkommen in unserem Forum

Meinst du so etwas:

Code: Alles auswählen

# wuf_ref: label_destroy_01.py

from tkinter import*

def createinterface():
    root=Tk()
    root.focus_force()
    bla=Label(root, text="blabla")
    bla.pack()
    blubb=Button(root, text="blubbblubb", command=
        lambda label_obj=bla: clearwindow(label_obj))
    blubb.pack()
    root.mainloop()

def clearwindow(label_obj):
    label_obj.destroy()

createinterface()
Gruss wuf :wink:
Take it easy Mates!
Noscavs
User
Beiträge: 2
Registriert: Montag 1. Februar 2010, 18:40

Aha, aha, okay.
Dankesehr!
Wie genau funktioniert das lambda? Damit ich es selbst auch verwenden kann... ;)
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Noscavs

Bei Tkinter Anwendungen brauchst du das 'lambda' um Argumente von einem Widget-Event-Rückruf an eine Funktion bzw. Methode übergeben zu können.

Hier noch weitere Info:
http://abop-german.berlios.de/read/lambda-forms.html
http://diveintopython.org/power_of_intr ... tions.html

Mit googeln findest du noch eine Menge mehr!

Gruss wuf :wink:
Take it easy Mates!
Antworten