mit destroy zerstörtes widged wieder errichten

Fragen zu Tkinter.
Antworten
py-mule
User
Beiträge: 58
Registriert: Samstag 3. Januar 2009, 10:42

Hi,
gibt es eine Möglichkeit, ein mit destroy zerstörtes widged wieder zu errichten?

Bsp.

Code: Alles auswählen

import Tkinter as tk

root = tk.Tk()

frame = tk.Frame(root,width = 20, height = 6)
frame.pack()

but1 = tk.Button(frame, text = 'but1', width = 20, height = 3)
but1.pack()

def zerstoere_but1():
    but1.destroy()

but2 = tk.Button(frame, command = zerstoere_but1, text= 'del but1', width = 20, height = 3)
but2.pack()

def build_but1():
    pass

but3 = tk.Button(frame, command = build_but1, text= 'build_but1', width = 20, height = 3)
but3.pack()

root.mainloop
Gruß
py-mule
busfahrer
User
Beiträge: 111
Registriert: Donnerstag 9. Oktober 2008, 17:42

Hallo
mit dem Geometry Manager Grid könnte man sowas machen.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf8 -*-

import Tkinter as tk 

root = tk.Tk() 

frame = tk.Frame(root,width = 20, height = 6) 
frame.grid() 

but1 = tk.Button(frame, text = 'but1', width = 20, height = 3) 
but1.grid(row=0,column=0) 

def zerstoere_but1(): 
    but1.grid_forget() 

but2 = tk.Button(frame, command = zerstoere_but1, text= 'del but1', width = 20, height = 3) 
but2.grid(row=1,column=0) 

def build_but1(): 
    but1.grid(row=0,column=0) 

but3 = tk.Button(frame, command = build_but1, text= 'build_but1', width = 20, height = 3) 
but3.grid(row=2,column=0) 

root.mainloop()
Vielleicht reicht dir das ja schon.Ich weiss nicht ob das auch mit dem
Geometry Manager Pack möglich ist.

Gruß...busfahrer
Alles wird gut ;-)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ich verstehe zwar nicht viel von Tkinter, aber es existiert auch die Funktion "pack_forget". Mit dem "after"- bzw. "before"-Parameter der "pack"-Funktion sollte sich dann wahrscheinlich der Rest lösen lassen.
Das Leben ist wie ein Tennisball.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo py-mule

Beim Grid-Layout-Manger gibt es noch die grid_remove() Methode. Es wurde im folgenden Beitrag darüber diskutiert:
http://www.python-forum.de/topic-15149. ... rid+remove

Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo py-mule

Hier noch eine kleine Übung mit der von EyDu erwähnten pack_forget()-Methode. Interessanterweise existiert beim Pack-Layout-Manager keine Methode pack_remove()!:

Code: Alles auswählen

import Tkinter as tk

def hide_show_switch():
    if button.cget('text') == HIDE:
        button.config(text=SHOW)
        #~~ Pack-Daten des 'test_widget' sichern
        test_widget.packing_data = test_widget.pack_info()
        #~~ Das 'test_widget'-Objekt wird entfernt
        test_widget.pack_forget()
    else:
        button.config(text=HIDE)
        #~~ Restauriere das entfernte 'test_widget' wieder
        test_widget.pack_configure(test_widget.packing_data)

app_win = tk.Tk()
app_win.config(bg='yellow')

HIDE = 'Hide-Widget'
SHOW = 'Show-Widget'

test_frame = tk.Frame(app_win, bg=app_win.cget('bg'))
test_frame.pack()

test_widget = tk.Canvas(test_frame, bg='steelblue', width=50, height=50,
    highlightthickness=0)
test_widget.pack(pady=5)

button_frame = tk.Frame(app_win)
button_frame.pack()

button = tk.Button(text=HIDE, width=20, command=hide_show_switch,
    highlightthickness=0)
button.pack()

#~~ Attribut 'packing_data' ans 'test_widget'-Objekt haengen um die Verwendung
#   der 'global'-Anweisung zu umgehen
test_widget.packing_data = test_widget.pack_info()

app_win.mainloop()
Gruss wuf :wink:
Take it easy Mates!
Antworten