Seite 1 von 1

Frame einblenden und ausblenden

Verfasst: Dienstag 1. März 2005, 20:44
von Tobias_Hartwich
Hallo,

ich programmiere erst seit heute mit GUI also nicht wundern, wennich noch nicht allzuviel Ahnung habe :-)

Zu meiner Frage:

Ich habe einen Button und beim draufklicken soll ein Frame angezeigt werden.. Klappt soweit auch gut. Jetzt habe ich aber einen zweiten Button, welcher dafür sorgen soll, dass der Frame wieder ausgeblendet wird. Ich hab es zunächst mit der Methode destroy() versucht, das Problem hierbei ist, dass die Widgets dabei komplett zerstört werden und ich bei einem erneutem Klicken des "Anzeigen" Buttons eine Fehlermeldung bekomme (logischweise)

Gibt es einen Parameter für die Frame-Klasse mitder ich die "visibility" einstellen kann oder wie würde man am besten vorgehen?

Danke für eure Hilfe bereits im Voraus

Tobias Hartwich

Verfasst: Montag 7. März 2005, 16:32
von knekke
Hallo,
probier das mal:

Code: Alles auswählen

from Tkinter import *

root = Tk()

def popup():
    pop=Tk()
    lab=Label(pop,text="POPUP!").grid()
    close=Button(pop,text="close",command=lambda: pop.destroy()).grid()
    
but = Button(root,text="popup",command=lambda: popup())
but.grid()

root.mainloop()
...funktioniert mit destroy(). Wenn es überhaupt das ist was Du wolltest...

Verfasst: Montag 7. März 2005, 16:50
von mawe
Hi!

Also mir fällt da forget() ein:

Code: Alles auswählen

from Tkinter import *

root = Tk()
f = Frame()
Button(text="Hide",command=f.forget).pack()
Button(text="Show",command=f.pack).pack()
f.pack()
Label(f, text="Hello").pack()
Label(f, text="Hello2").pack()
root.mainloop()
Das Problem ist nur folgendes: Wenn das Frame anfangs oberhalb der Buttons sitzt, ist es nach forget und pack unterhalb :?. Es gibt noch die Möglichkeit mit info = f.info() die pack-Parameter zu holen, und dann mit f.pack(info) neu zu packen, aber das ändert irgendwie nichts, hmmm... Das ganze geht auch mit grid, spiel mal damit herum :)

Gruß, mawe

Verfasst: Montag 7. März 2005, 17:00
von knekke
Vergiss meinen ersten post....

das hier geht evtl. eher in richtung das was du suchst:

Code: Alles auswählen

from Tkinter import *

root = Tk()
mark=0
lab=0
def popup():
    global mark, lab
    if mark==0:
        lab=Label(root,text="POPUP!")
        lab.grid()
        mark=1
    else:
        lab.destroy()
        mark=0
    
but = Button(root,text="popup",command=lambda: popup())
but.grid()

root.mainloop()
ich bin mit den Namensräumen nicht besonders fit (eigentlich garnicht), deshalb die global anweisung. Das geht bestimmt auch eleganter...

Verfasst: Montag 7. März 2005, 17:04
von mawe
Hi!

Mit grid gehts ungefähr so:

Code: Alles auswählen

from Tkinter import *

class GUI:
    def __init__(self):
        root = Tk()
        self.info = {}
        
        Button(text="Hide",command=self.forget_it).grid(row=2,column=0)
        Button(text="Show",command=self.pack_it).grid(row=3,column=0)
        
        self.f = Frame()
        self.f.grid(row=1,column=0)
        Label(self.f, text="Hello").pack()
        Label(self.f, text="Hello2").pack()
        
        root.mainloop()
        
    def forget_it(self):
        self.info = self.f.grid_info()
        self.f.grid_forget()

    def pack_it(self):
        self.f.grid(self.info)

GUI()
Gruß, mawe