RISOLTO [Python] integrare 'scrollbar' in un frame con diverse labels

Hirmia

Nuovo Utente
16
2
Ciao a tutti! Vorrei creare un frame scorrevole verticalmente che contiene al suo interno diverse labels. Ho provato ad utilizzare ''scrollbar'' in diversi modi ma ci sono sempre errori. Vi mostro uno dei codici e i vari passaggi per una maggiore chiarezza. Qualcuno potrebbe gentilmente aiutarmi, please?

ps: uso python 3

Questa è l'interfaccia con solo la barra di scorrimento:

Python:
import tkinter as tk

def populate(frame):
    label=tk.Label(frame, text='sono un adesivo1', bg='DarkOrange1', height=100, width=30)
    label.grid(row=3, column=1)

    label=tk.Label(frame, text='sono un adesivo2', bg='DarkOrange1')
    label.grid(row=4, column=1, padx=10,pady=10)

    label=tk.Label(frame, text='sono un adesivo3', bg='DarkOrange1')
    label.grid(row=5, column=1, padx=10,pady=10)

def onFrameConfigure(canvas):
    '''Reset the scroll region to encompass the inner frame'''
    canvas.configure(scrollregion=canvas.bbox("all"))

root = tk.Tk()
canvas = tk.Canvas(root, borderwidth=0, bg='khaki1')
frame = tk.Frame(canvas, bg='khaki1')
vsb = tk.Scrollbar(root, orient="vertical", command=canvas.yview)
canvas.configure(yscrollcommand=vsb.set)

vsb.pack(side="right", fill="y")
canvas.pack(side="left", fill="both", expand=True)
canvas.create_window((4,4), window=frame, anchor="nw")

frame.bind("<Configure>", lambda event, canvas=canvas: onFrameConfigure(canvas))

populate(frame)

root.mainloop()

Questa invece è l'interfaccia in cui voglio integrare la scrollbar:


Python:
import tkinter as tk

def FinestraScorrevole():
    frameS=tk.Frame(root, height=400, width=100, bg='pale green')
    frameS.grid(row=0, column=0, sticky="WE")     #  con WE dovrebbe appqrire a sx... Se non c'è, al centro di default

def saluto():
    print('ciao ciao')

def fiaba():
    print('Biancaneve!!')

root=tk.Tk()
root.title('comando saluto')
root.configure(bg='white')


frame1=tk.Frame(root, bg='light cyan2')
frame1.grid(row=0, column=0, sticky="we")

framePub=tk.Frame(root, height=300, width=400, bg='thistle1')
framePub.grid(row=1, column=0, padx=10,pady=10)

frame2=tk.Frame(root, bg='aquamarine')
frame2.grid(row=2, column=0, sticky="we", padx=1,pady=10)

frame2b=tk.Frame(root, height=300, width=400, bg='khaki1')
frame2b.grid(row=3, column=0, sticky="we", padx=1,pady=1)

frame3=tk.Frame(root, bg='lavender')
frame3.grid(row=4, column=0, sticky="we", padx=1,pady=1)



bottone=tk.Button(frame1, command=FinestraScorrevole)
bottone.grid(row=0, column=0)
iconaRigata= tk.PhotoImage(file="pupazzo-neve-animato_gif.gif", width=100, height=100)  
bottone.configure(image=iconaRigata, width=100, height=100)

label=tk.Label(frame1, text='sono un adesivo', bg='VioletRed2')
label.grid(row=0, column=1)

label=tk.Label(frame2b, text='sono un adesivo', bg='DarkOrange1')
label.grid(row=3, column=1)

label=tk.Label(frame2b, text='sono un adesivo', bg='DarkOrange1')
label.grid(row=4, column=1, padx=10,pady=10)

label=tk.Label(frame2b, text='sono un adesivo', bg='DarkOrange1')
label.grid(row=5, column=1, padx=10,pady=10)

bottone=tk.Button(frame3, text='salutami', bg='light cyan2', activeforeground='plum1', command=saluto)
bottone.grid(row=0, column=0)

bottone=tk.Button(frame3, text='fiaba', bg='light cyan2', activeforeground='azure', command=fiaba)
bottone.grid(row=0, column=1)

root.mainloop()

Fin qui le singole interfacce funzionano. Quando però provo ad integrarle l'un l'altra, si generano errori di vario tipo. Vi mostro il mio ultimo tentativo che mi ha portato a ....[rullo di tamburi]...:

'tkinter.TclError: cannot use geometry manager pack inside . which already has slaves managed by grid'

In generale mi è parso di comprendere che non è possibile usare pack e grid nella nestra finestra. Però nell'interfaccia con la scrollbar stanno perfettamente insieme. Sulla falsa riga di questa costruzione ho provato a generare un nuovo codice, ma come vi ho appena detto, si genera l'errore. Cosa mi sfugge?

Python:
import tkinter as tk

# fascia 1  

def fascia1(frame1):
    frame1=tk.Frame(root, bg='light cyan2')
    frame1.grid(row=0, column=0, sticky="we")

    bottone=tk.Button(frame1, command=FinestraScorrevole)
    bottone.grid(row=0, column=0)
    iconaRigata= tk.PhotoImage(file="pupazzo-neve-animato_gif.gif", width=100, height=100)  
    bottone.configure(image=iconaRigata, width=100, height=100)

    label=tk.Label(frame1, text='sono un adesivo', bg='VioletRed2')
    label.grid(row=0, column=1)

def FinestraScorrevole():
    frameS=tk.Frame(root, height=400, width=100, bg='pale green')
    frameS.grid(row=0, column=0, sticky="WE")

# fascia Pub

def fasciaPub(framePub):
    framePub=tk.Frame(root, height=300, width=400, bg='thistle1')
    framePub.grid(row=1, column=0, padx=10,pady=10)

# fascia 2

def fascia2(frame2):
    frame2=tk.Frame(root, bg='aquamarine')
    frame2.grid(row=2, column=0, sticky="we", padx=1,pady=10)

# fascia 2b

def fascia2b(frame2b):
    label=tk.Label(frame, text='sono un adesivo1', bg='DarkOrange1', height=100, width=30)
    label.grid(row=3, column=1, padx=10,pady=10)

    label=tk.Label(frame, text='sono un adesivo2', bg='DarkOrange1')
    label.grid(row=4, column=1, padx=10,pady=10)

    label=tk.Label(frame, text='sono un adesivo3', bg='DarkOrange1')
    label.grid(row=5, column=1, padx=10,pady=10)

def onFrameConfigure(canvas):
    '''Reset the scroll region to encompass the inner frame'''
    canvas.configure(scrollregion=canvas.bbox("all"))


# fascia 3

def fascia3(frame3):
    canvas3=tk.Canvas(root, bg='lavender')
    frame3=tk.Frame(root, bg='lavender')
    frame3.grid(row=4, column=0, sticky="we", padx=1,pady=1)

    bottone=tk.Button(frame3, text='salutami', bg='light cyan2', activeforeground='plum1', command=saluto)
    bottone.grid(row=0, column=0)

    bottone=tk.Button(frame3, text='fiaba', bg='light cyan2', activeforeground='azure', command=fiaba)
    bottone.grid(row=0, column=1)

def saluto():
    print('ciao ciao')

def fiaba():
    print('Biancaneve!!')


root=tk.Tk()
root.title('comando saluto')
root.configure(bg='white')




# canvas 1

canvas1=tk.Canvas(root, bg='light cyan2')
frame1=tk.Frame(canvas1, bg='light cyan2')

bottone=tk.Button(frame1, command=FinestraScorrevole)
iconaRigata= tk.PhotoImage(file="pupazzo-neve-animato_gif.gif", width=100, height=100)  
bottone.configure(image=iconaRigata, width=100, height=100)
bottone.pack(side='left')

fascia1(frame1)

# canvas Pub

canvasPub=tk.Canvas(root, height=300, width=400, bg='thistle1')
framePub=tk.Frame(canvasPub, height=300, width=400, bg='thistle1')

fasciaPub(framePub)

# canvas 2

canvas2=tk.Canvas(root, bg='aquamarine')
frame2=tk.Frame(canvas2, bg='aquamarine')

fascia2(frame2)

# canvas 2b _ scrollbar

canvas = tk.Canvas(root, borderwidth=0, bg='khaki1')
frame2b = tk.Frame(canvas, bg='khaki1')
vsb = tk.Scrollbar(root, orient="vertical", command=canvas.yview)
canvas.configure(yscrollcommand=vsb.set)

vsb.pack(side="right", fill="y")
canvas.pack(side="left", fill="both", expand=True)
canvas.create_window((4,4), window=frame2b, anchor="nw")

frame2b.bind("<Configure>", lambda event, canvas=canvas: onFrameConfigure(canvas))

fascia2b(frame2b)

# frame 3

canvas3=tk.Canvas(root, bg='lavender')
frame3=tk.Frame(canvas3, bg='lavender')

fascia3(frame3)


root.mainloop()
 
Ultima modifica:

Hirmia

Nuovo Utente
16
2
A titolo di cronaca, la chiave è sostituire

vsb.grid(row=0, column=1, sticky='ns') e canvas.grid(row=0, column=0, sticky='nsew').
 
  • Mi piace
Reactions: Mursey

Entra

oppure Accedi utilizzando