Forum >> Principianti >> Apertura menu laterale

Pagina: 1

Buongiorno a tutti voi,
vorrei sapere se è possibile aprire un frame sul lato sinistro della finestra in tkinter facendo in modo che inizialmente sia nascosto e cliccando su un bottone il frame venga aperto lentamente da sinistra verso destra. Il frame dovrà accupare la finestra interamente in altezza e una larghezza finale di 100.




Vi ringrazio per il cortese aiuto che potrete darmi.
Puoi "giocare" con il gestore di geometria che utilizzi, esempio con grid:

import tkinter as tk

class MyApp(tk.Tk):
    def __init__(self):
        super().__init__()
        self.f = tk.Frame(self, bg='red', width=100)
        self.f.grid(row=0, column=0, sticky='ns')
        f2 = tk.Frame(self, bg='green')
        f2.grid(row=0, column=1, sticky='nsew')
        b = tk.Button(self, text='Switch menu', command=self.on_switch)
        b.grid(row=1, column=0, columnspan=2, sticky='ew')
        self.grid_columnconfigure(1, weight=1)
        self.grid_rowconfigure(0, weight=1)
        self.geometry('300x200')
        self.f.grid_remove()

    def on_switch(self):
        if self.f.grid_info():
            self.f.grid_remove()
        else:
            self.f.grid(row=0, column=0, sticky='ns')
        self.update()
        
if __name__ == '__main__':
    app = MyApp()
    app.mainloop()
In questo esempio definisco due frame, uno rosso ed uno verde, in una finestra, e rimuovo il rosso dalla rappresentazione, nella funzione di callback verifico la condizione di rappresentazione del frame rosso e, a seconda dei casi, lo aggiungo o lo rimuovo, rendendolo di fatto visibile/invisibile.




Se utilizzi il gestore pack, leggi la docs di unpack()




Ciao

Fatti non foste a viver come bruti...
nuzzopippo Ti ringrazio per il suggerimento che mi hai dato, questo esempio mi torna utile in quanto il pulsante rimane al di sopra dei frame.



Questo tipo di visualizzazione però so come ottenerla, quello che non riesco a fare è la visualizzazione del frame laterale, quello rosso, che si apre verso destra lentamente, per esempio ogni secondo si allarga di 2 fino ad arrivare alla sua apertura massima di 100.




In pratica anche se metto una tempificazione o uno sleep per far bloccare l'apertura e poi allo scadere dello sleep riprende l'apertura del frame, quello che mi aspetto non si verifica. Quello che succede e che alla fine di tutto il ciclo appare il frame completamente aperto
In pratica anche se metto una tempificazione o uno sleep per far bloccare l'apertura e poi allo scadere dello sleep riprende l'apertura del frame, quello che mi aspetto non si verifica. Quello che succede e che alla fine di tutto il ciclo appare il frame completamente aperto
Ovviamente, se vuoi che venga prodotto un effetto "scenografico" devi aggiornare "la scena" a passetti ... nel codice sopra prova ad importare time e giocare con le dimensioni, modifica on_switch cosi:

    def on_switch(self):
        if self.f.grid_info():
            self.f.grid_remove()
            self.f['width'] = 10
        else:
            self.f.grid(row=0, column=0, sticky='wns')
            for i in range(25):
                self.f['width'] = (i + 1) * 4
                self.update()
                time.sleep(0.04)
        self.update()
a me funziona

... bada bene, però, con controlli interni al frame self.f le cose si complicano, studiati bene la docs relativa ai widget ed al gestore di geometria.

Inoltre, tieni presente che nei tempi di "attesa" l'interfaccia in se è bloccata, non è un procedimento thread-safe.

Fatti non foste a viver come bruti...
nuzzopippo per me per quel che vale sei un GRANDE.


Quando ho letto il codice che hai scritto, mi è caduto subito l'occhio su self.update. E' bastato che al mio codice mettesi questa semplice istruzione e per magia l'effetto che volevo era sotto i miei occhi.




Credimi prima di porre questo problema al forum ho girato tanto sul web ma non sono riuscito a trovare, o non ho visto bene, nulla riguardo questa istruzione.




Ancora un infinito GRAZIE



Pagina: 1



Esegui il login per scrivere una risposta.