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:
Questa invece è l'interfaccia in cui voglio integrare la scrollbar:
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?
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: