Can't delete Tcl command

Fragen zu Tkinter.
Antworten
Benutzeravatar
sorgenlos
User
Beiträge: 69
Registriert: Donnerstag 15. Februar 2007, 00:52

Ich habe ein größeres Projekt mit Oberflächen geschrieben geschrieben.
Ich habe ein Tk Fenster. Dieses Ruft ein TL auf. Im TL wird ein neues Tk Fenster des gleichen Typs des ersten Tk Fensters erstellt und dann das alte Tk durch self.parent.destroy() zerstört.
Mein Programm funktioniert soweit, wie ich es wünsche nur immer beim Zerstören kommt der Fehler: Can't delete Tcl command.
Der Fehler stört beim Programmablauf nicht. Ich will aber keine Fehler im Programm. Was ist das? Ist es ein Bug von Tkinter?
BlackJack

Heisst das jetzt Du hast zwei Exemplare von `Tk` im Programm? Selbst wenn nicht, ist das zerstören eines "Eltern"-Widgets sicher nicht der richtige Weg.
xnyzer
User
Beiträge: 5
Registriert: Mittwoch 18. Juni 2008, 18:00
Wohnort: Berlin

Hallo,
ich arbeite mit am Projekt von sorgenlos.

Was meinst du mit zwei Exemplaren? Also ja.. für eine kurze Zeit gibt es von dem Tk-Fenster zwei. Das erste wird aber direkt nach der Erstellung des Zweiten zerstört.
Warum ist es keine Möglichkeit? Ich möchte das Fenster nicht mehr haben. Ich brauche es nicht mehr. Wie soll ich es sonst wegbekommen?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

xnyzer hat geschrieben:Ich möchte das Fenster nicht mehr haben. Ich brauche es nicht mehr. Wie soll ich es sonst wegbekommen?
So z.B.

Code: Alles auswählen

import Tkinter as tk

class App(object):

    def __init__(self):
        self.root = tk.Tk()
        tk.Button(text="Create Window",command=self.create_window).pack()
        tk.Button(text="Delete Window",command=self.delete_window).pack()
        self.root.mainloop()

    def create_window(self):
        try:
            self.window.deiconify()
        except:
            self.window = tk.Toplevel()

    def delete_window(self):
        try:
            self.window.withdraw()
        except:
            pass

app = App()
xnyzer
User
Beiträge: 5
Registriert: Mittwoch 18. Juni 2008, 18:00
Wohnort: Berlin

aber ist es nicht so, dass withdraw() das fenster nur versteckt?
ich will es ja nicht verstecken sondern es wirklich "weghaben". ist das nicht möglich? muss ich alle fenster, die ich nicht mehr will (versteckt) geöffnet haben???
BlackJack

So ein `Tk`-Exemplar ist einzigartig, das darf man nur einmal erstellen. Daran hängt die Tk-Laufzeitumgebung. Wenn man mehrere "Hauptfenster" braucht, muss man das mit `Toplevel` machen. Notfalls kann man ja das `Tk`-Fenster gleich zu Beginn unsichtbar machen (`withdraw()`) und auch das erste Fenster schon mit `Toplevel` erstellen.
xnyzer
User
Beiträge: 5
Registriert: Mittwoch 18. Juni 2008, 18:00
Wohnort: Berlin

ahhhh... okay!
vielen dank :D
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo xnyzer

Wie schon BlackJack sagte kann in einer Anwendung nur ein Tk-Hauptfenster existieren. Du kannst aber mit der Methode os.popen('python my_new_tk.py') ein neues Python-Skript starten, welches wieder ein Tk-Hauptfenster erzeugt. Unmittelbar nach der Anweisung: os.popen('python my_new_tk.py') musst du mit der Methode 'sys.exit(0)' das erste Tk-Hauptfenster bzw. Anwendung wieder schliessen.

Gruss wuf :wink:
Take it easy Mates!
xnyzer
User
Beiträge: 5
Registriert: Mittwoch 18. Juni 2008, 18:00
Wohnort: Berlin

Sooo.. jetzt habe ich nur noch ein Tk. Alles andere sind TL.
Sobald ich aber mein Programm beenden möchte und auf das "X" im Tk klicke, wird das Fenster geschlossen und die gleiche Fehlermeldung erscheint.
Was nun?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Mit passendem Code dazu wäre es einfacher, die Frage zu beantworten.
Antworten