Widgets zerstören

Fragen zu Tkinter.
Antworten
Louis19
User
Beiträge: 18
Registriert: Mittwoch 17. Juni 2009, 12:07

Hallo zusammen,

Ich hab ein Problem mit einem Programm, dass ein Label zerstören soll, wenn man auf einen Button klickt. Dazu hatte ich folgendes Programm geschrieben:

Code: Alles auswählen

from Tkinter import*

fenster = Tk()

l = Label(fenster, text='lösch mich').pack()

def loschen():
    l.destroy()

button = Button(fenster, text='Text löschen', command=loschen).pack()
fenster.mainloop() 
Jetzt kommt aber die Fehlermeldung: AttributeError: 'NoneType' object has no attribute 'destroy'

Kann mit das wer erklären was das bedeutet oder sagen wir es richtig geschrieben werden muss ?

Viele Grüße
Lous19
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Code: Alles auswählen

l = Label(fenster, text='lösch mich')
l.pack()
Selbiges gilt auch für den Button.
Dann solltest du keine *-importe machen, besser "from Tkinter import tk" und dann per "tk.Label" auf den Inhalt des Moduls zugreifen.
Außerdem sollte kein Code auf Modulebene stehen, da du dein Modul sonst nicht importieren kannst. Die globale Variable "l" ist da natürlich äußerst gruselig.
Das Leben ist wie ein Tennisball.
Louis19
User
Beiträge: 18
Registriert: Mittwoch 17. Juni 2009, 12:07

Hey Super! Danke für die schnelle Antwort.

Programm läuft jetzt.

:D

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

Hallo EyDu
EyDu hat geschrieben:Dann solltest du keine *-importe machen, besser "from Tkinter import tk" und dann per "tk.Label" auf den Inhalt des Moduls zugreifen.
Hier hast du sicher folgendes gemeint:

Code: Alles auswählen

import Tkinter as tk
Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
jonas
User
Beiträge: 156
Registriert: Dienstag 9. September 2008, 21:03

Hast du EyDu's Rat beachtet?

Code: Alles auswählen

# -*- coding: cp1252 -*-
import Tkinter as tk

def widget_destroyer(widget):
    widget.destroy()

if __name__ == '__main__':

    window = tk.Tk()
    window.title('WidgetDestroyer')

    label_to_destroy = tk.Label(window, text='I am a label to destroy',
                                            width=40)
    label_to_destroy.pack()

    # width=40 bestimmt die Anzahl der Zeichen,
    # nebeneinander passen
    # ist meiner meinung nach eine optische
    # Verbesserung

    destroybutton = tk.Button(window, text='Destroy Label',
                              command=lambda w=window.winfo_children()[0]:
                              widget_destroyer(w),
                              width=40)
    
    # window.winfo_children() gibt alle 'Kinder' des Fensters
    # wieder und da label_to_destroy als erstes erzeugt wurde
    # hat es in der liste den index 0
    
    destroybutton.pack()

    window.mainloop()
Lg, Jonas :D
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

wuf hat geschrieben:Hier hast du sicher folgendes gemeint:

Code: Alles auswählen

import Tkinter as tk
Nee, ich benutze Python 3.0 und habe mir meine eigene Tkinter.py geschrieben...

Code: Alles auswählen

import tkinter as tk
...
:wink:
Das Leben ist wie ein Tennisball.
Antworten