Frame einblenden und ausblenden

Fragen zu Tkinter.
Antworten
Tobias_Hartwich

Dienstag 1. März 2005, 20:44

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
Benutzeravatar
knekke
User
Beiträge: 100
Registriert: Freitag 29. Oktober 2004, 17:23
Wohnort: Schweden

Montag 7. März 2005, 16:32

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...
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Montag 7. März 2005, 16:50

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
Benutzeravatar
knekke
User
Beiträge: 100
Registriert: Freitag 29. Oktober 2004, 17:23
Wohnort: Schweden

Montag 7. März 2005, 17:00

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...
Zuletzt geändert von knekke am Montag 7. März 2005, 17:09, insgesamt 1-mal geändert.
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Montag 7. März 2005, 17:04

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
Antworten