Python Label verstecken oder Frames "neustarten"

Fragen zu Tkinter.
Antworten
Duardo
User
Beiträge: 54
Registriert: Mittwoch 2. Juli 2014, 16:56

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()
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.
Duardo
User
Beiträge: 54
Registriert: Mittwoch 2. Juli 2014, 16:56

@BlackJack: Kannst du mir ein Beispiel nennen? Bei Google finde ich soweit nichts hilfreiches.
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.
Duardo
User
Beiträge: 54
Registriert: Mittwoch 2. Juli 2014, 16:56

@BlackJack: OK, habs verstanden und es funktioniert sehr gut. Aber geht das nur mit pack() oder auch mit place()?
BlackJack

@Duardo: `place()` sollte man nicht verwenden. Ansonsten hilft ein wenig Nachdenken. ;-)
Duardo
User
Beiträge: 54
Registriert: Mittwoch 2. Juli 2014, 16:56

@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.
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.
Duardo
User
Beiträge: 54
Registriert: Mittwoch 2. Juli 2014, 16:56

@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.
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.
Antworten