Frames, Buttons etc. eines Fensters löschen

Fragen zu Tkinter.
Antworten
Ferox
User
Beiträge: 48
Registriert: Dienstag 14. März 2006, 16:34

Ich habe neulich mit Tkinter Fenster gebastelt(hf=Tk() ) und dabei folgendes festgestellt:
Wenn man zum Beispiel auf Knopfdruck Fenster A schließt und Fenster B öffnet, so öffnet sich Fenster B etwas versetzt(von der ehemaligen Position des Fensters A aus gesehen).
Deshalb "wandert" die Position der Fenster bei mehrmaligem öffnen und schließen (Auch wenn man die Python-command-line mehrmals startet taucht dieses Problem auf, wobei da die Versetzung sinnvoll ist).

Daher meine Frage(n):
a) Kann man Tkinter irgendwie anweisen, das Fenster z.B. oben links im Bildschirm zu erstellen?
- oder -
b) Kann man verhindern, dass das Fenster versetzt generiert wird?
- oder -
c) Gibt es eine Art "Reset", der den Inhalt des Fensters(Frames, Buttons) auf 0 zurücksetzt?(Ich schreib ma auf was ich mir da so denke):

hf=Tk()
hf.title('Titel')
...
...(Inhalt; Frames, Buttons etc.)...
...
hf.reset()

Danke schonmal =)
Zuletzt geändert von Ferox am Mittwoch 24. Januar 2007, 17:38, insgesamt 1-mal geändert.
Ferox
User
Beiträge: 48
Registriert: Dienstag 14. März 2006, 16:34

Hab noch ein bischen im Forum gesucht...für a und b hab ich eine Antwort gefunden, und zwar hier

Nur bei dem Resett weis ich noch nich weiter =(
BlackJack

Widgets haben eine `forget()`-Methode um sie aus dem Elternwidget "rauszunehmen" und eine `destroy()`-Methode, die das Widget und alle Kinder "zerstört".
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Ferox hat geschrieben:
hf=Tk()
hf.title('Titel')
...
...(Inhalt; Frames, Buttons etc.)...
...
hf.reset()
das geht so,

Code: Alles auswählen

hf=Tk
#..blabla 
#bei Geometriemanager pack
hf.pack_forget()
#bei grid
hf.grid_forget()
oder stell deine frage anders und dem entsprechend wird sie beantwortet.
Ferox
User
Beiträge: 48
Registriert: Dienstag 14. März 2006, 16:34

Danke für die Antwort, aber irgendwie macht der das nicht(wahrscheinlich bin ich zu blöd); hab beides mal ausprobiert; ich denke das ich das pack_forget nehmen müsste....ich schreib mal einen (vereinfachten) Ausschnitt hierhin:

Code: Alles auswählen

hf=Tk()
hf.title("Eintrag hinzufügen")
hf.config(bg="black")
Hrahmen=Frame(hf, bg="Black")
Hrahmen.pack()
Button(Hrahmen, text=' Test ', command=lambda: test(hf)).pack(side=LEFT)
....
....
hf.mainloop()
Und

Code: Alles auswählen

def test(hf):
     hf.pack_forget()
     rahmen=Frame(hf)
//Okay habs grad kapiert...is für alles was gepackt is :idea:

Dankeschön =)
Ferox
User
Beiträge: 48
Registriert: Dienstag 14. März 2006, 16:34

Gibt doch noch ein Problem:
Das Programmstück, dass ich zum experimentieren benutzt habe erzeugt einen AttributeError(s.u.)

Code: Alles auswählen

from Tkinter import *
def Start():
    hf=Tk()
    mf=Frame(hf)
    mf.pack()
    Button(mf, text='Test', command=lambda: test(mf.pack_forget())).pack()
    hf.mainloop()
def test(mf):
    Button(mf, text='Test2', command=lambda: test2(mf.pack_forget())).pack()

def test2(mf):
     Button(mf, text='Test3').pack()

Start()
Der Fehler lautet:
Exception in Tkinter callback
Traceback (most recent call last):
File "E:\Programme\Programmieren\Python\lib\lib-tk\Tkinter.py", line 1403, in __call__
return self.func(*args)
File "E:/Programme/Programmieren/Python/Test.py", line 9, in <lambda>
Button(mf, text='Test2', command=lambda: test2(mf.pack_forget())).pack()
AttributeError: 'NoneType' object has no attribute 'pack_forget'
BlackJack

Das ist ein ganz kleines bisschen wirr was Du da machst. Schau Dir an wo der Aufruf von `test()` steht: Da wird das Ergebnis von `mf.pack_forget()` übergeben. Das ist `None`.
Ferox
User
Beiträge: 48
Registriert: Dienstag 14. März 2006, 16:34

Richtig, das hab ich mir auch schon gedacht. Aber auch wenn ich jetzt zum Beispiel

Code: Alles auswählen

def test(mf):
    mf.pack_forget()
    Button(mf, text='Test', lambda: test2(mf))
oder

Code: Alles auswählen

def test(mf):
    mf.pack_forget()
    mf.pack()
    Button(mf, text='Test', command=lambda: test2(mf))
mache, es kommt bei mir irgendwie immer derselbe Fehler raus =(
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

ich weiss zwar nicht was du machen willst, aber egal.

Code: Alles auswählen

from Tkinter import *
hf=Tk()

def test2():
     Button(hf, text='Test3').pack()     
def Start():
	mf=Frame(hf)
	mf.pack()
	b=Button(mf, text='Test', command=lambda: test(mf))
	b.pack()
	hf.mainloop()
	
def test(mf):
	mf.pack_forget()
	test2()

Start() 
Ferox
User
Beiträge: 48
Registriert: Dienstag 14. März 2006, 16:34

Die Idee ist, ganz viele Fenster(-inhalte) darzustellen ohne ganz viele Fenster machen zu müssen. :roll:
Und das ganze halt hintereinander
Antworten