Seite 1 von 1

Python Label verstecken oder Frames "neustarten"

Verfasst: Sonntag 10. August 2014, 16:02
von Duardo
Hallo, in meinem Programm habe ich zwei Images in einem Label. All dies findet in einem Frame statt. Nun möchte ich, dass wenn man aus dem Frame rausgeht, dieses Label verschwindet. Ich habe es mit destroy() versucht, nur bleibt das Label dann gelöscht. Gibt es irgendeine Möglichkeit den Frame "neuzustarten" oder den Label wiederherzustellen, wenn man zum besagten Frame zurückkehrt? Oder gibt es Möglichkeiten einen Label zu verstecken? Schonmal Danke im voraus. :D Hier ist noch mein Code:

Code: Alles auswählen

# -*- coding: cp1252 -*-
from glob import glob
from itertools import cycle
import Tkinter as tk
from Tkinter import *
from functools import partial
import random

class SampleApp(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        
        self.title("test")
        self.state('zoomed')

        container= tk.Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames={}
        for F in (fenster, mode1):
            frame= F(container, self)
            self.frames[F]=frame
            frame.grid(row=0, column=0, sticky="nsew")

            self.show_frame(fenster)

    def show_frame(self, c):
        frame=self.frames[c]
        frame.tkraise()

class fenster(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

        label=tk.Label(self, text="Das ist die Startseite")
        label.pack()

        button=tk.Button(self, text="Start",
                         command=lambda: controller.show_frame(mode1))
        button.pack()

class mode1(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

        label1=tk.Label(self, text=" ")
        label1.pack()

        def show_next_1():
            image.configure(file=next(images_1))
            self.after(10, show_next_2)

        def show_next_2():
            image.configure(file=next(images_2))
            self.after(10)

        images_1=cycle(glob("Frame1.gif"))
        images_2=cycle(glob("Frame2.gif"))

        image = PhotoImage()
        
        label=Label(image=image)
        label.pack()
    
        def ok(label1):
            def do_a():
                show_next_1()
                
            def do_b():
                show_next_1()
                
            WORDS={"test1":do_a,
                   "test2":do_b}
            choice=random.choice(list(WORDS))
            label1['text']=choice
            WORDS[choice]()

        button1=tk.Button(self, text='Knopf', command=partial(ok, label1))
        button1.pack()

        def zurueck():
            controller.show_frame(fenster)
            label.destroy()

        button=tk.Button(self, text="Zurück",
                            command=zurueck)
        button.pack()

if __name__== "__main__":
    app=SampleApp()
    app.mainloop()

Re: Python Label verstecken oder Frames "neustarten"

Verfasst: Sonntag 10. August 2014, 16:18
von BlackJack
@Duardo: Mit der `forget()`-Methode kann man Widgets wieder aus einem Layout herausnehmen und (später) wieder neu mit einer der Layout-Methoden in einem Widget zur Anzeige bringen.

Der Quelltext wird übrigends immer wirrer. Ich habe da bisher schon keinen Sinn erkennen können, aber `cycle()`-Objekte mit jeweils nur einem Element zu erstellen ist extrem sinnfrei.

Re: Python Label verstecken oder Frames "neustarten"

Verfasst: Sonntag 10. August 2014, 16:51
von Duardo
@BlackJack: Kannst du mir ein Beispiel nennen? Bei Google finde ich soweit nichts hilfreiches.

Re: Python Label verstecken oder Frames "neustarten"

Verfasst: Sonntag 10. August 2014, 18:36
von BlackJack
@Duardo: Na Du rufst auf dem `Label`-Exemplar einfach die `forget()`-Methode auf und dann wird es nicht mehr dargestellt, existiert aber noch und kann mit `pack()` wieder neu in die Anzeige gesteckt werden. Alternativ `pack_forget()`. Bei Widgets die mit `grid()` platziert wurden muss man `grid_forget()` verwenden.

Re: Python Label verstecken oder Frames "neustarten"

Verfasst: Sonntag 10. August 2014, 19:24
von Duardo
@BlackJack: OK, habs verstanden und es funktioniert sehr gut. Aber geht das nur mit pack() oder auch mit place()?

Re: Python Label verstecken oder Frames "neustarten"

Verfasst: Sonntag 10. August 2014, 19:34
von BlackJack
@Duardo: `place()` sollte man nicht verwenden. Ansonsten hilft ein wenig Nachdenken. ;-)

Re: Python Label verstecken oder Frames "neustarten"

Verfasst: Sonntag 10. August 2014, 20:52
von Duardo
@BlackJack: Irgendwie kann ich es mit pack() nicht verschieben. Beispielsweise bei .pack(side="top") oder anderen Verschiebemöglichkeiten bleiben die Images an ihrem Platz.

EDIT: Nach links und rechts kann ich das Label doch verschieben, nur nicht nach oben oder unten.

Re: Python Label verstecken oder Frames "neustarten"

Verfasst: Sonntag 10. August 2014, 21:16
von BlackJack
@Duardo: Warum willst Du ein `Label` denn ”verschieben”? Was für komische Sachen versuchst Du da eigentlich zu machen? Das sieht insgesamt alles ziemlich abenteuerlich aus.

Re: Python Label verstecken oder Frames "neustarten"

Verfasst: Montag 11. August 2014, 11:32
von Duardo
@BlackJack: Nun ich habe eine Animation mit images. Diese werden in diesem Label dargestellt. Nur werden sie bei mir mit einem einfachen pack ganz unten und nur teilweise dargestellt. Deshalb würde ich das Label gerne woanders hin verschieben.

Re: Python Label verstecken oder Frames "neustarten"

Verfasst: Montag 11. August 2014, 11:50
von BlackJack
@Duardo: Dann sollte man vielleicht besser die Ursache heraus finden warum das Label nicht dort dargestellt wird wo es soll und dann auch noch unvollständig, statt mit absolutem verschieben an den Symptomen herum zu doktorn.