如何使用 tkinter 在可滚动框架内存储和添加水平框架?

How to store and add horizontal frames within a scrollable frame using tkinter?

我正在尝试实现这样的设计,其中在可滚动的框架内有一个 canvas,因此我可以在框架中包含很多不同的条目。我已经添加了我目前拥有的代码。列表框只是一个测试,我不会使用列表框。我基本上需要一种方法来在我认为的滚动条框架内存储大量水平框架,它可以容纳 canvas 来显示图像,以及一些 buttons/labels。我目前拥有的代码意味着可滚动框架 window 非常小,所以我需要知道如何放大它以及如何制作它,以便我可以在可滚动框架中存储尽可能多的框架。谢谢

    customisationWindow = tk.Toplevel(mainWindow)
    customisationWindow.geometry("700x580")
    customisationWindow.title("DIY Store Quote System")
    tabControl = ttk.Notebook(customisationWindow)

    tab1 = ttk.Frame(tabControl, width=300)
    tab1.pack(fill="both", expand=1)
    tab2 = ttk.Frame(tabControl)
    tab3 = ttk.Frame(tabControl)
    tab4 = ttk.Frame(tabControl)
    tab5 = ttk.Frame(tabControl)

    tabControl.add(tab1, text='Select Wallpaper')
    tabControl.add(tab2, text='Select Colour')
    tabControl.add(tab3, text='Select Detailing')
    tabControl.add(tab4, text='Add Adhesive/Lining')
    tabControl.add(tab5, text='View Basket')
    tabControl.pack(expand=1, fill="both")
    createTab1(tab1)
    createTab2(tab2)
    createTab3(tab3)
    createTab4(tab4)
    createTab5(tab5)


def createTab5(tab):

    yourBasketLabel = Label(tab, text="Your Basket", bg="#94B3BD",
                        font=("Times New Roman", 14)).place(x=50, y=50)

    basketFrame = Frame(tab, width=550, height=400)
    basketFrame.place(x=50, y=70)
    basketCanvas = Canvas(basketFrame, width=550, height=400)
    basketCanvas.place(x=50, y=70)
    scrollbar = Scrollbar(basketCanvas)
    scrollbar.pack(side=RIGHT, fill=Y)
    
    mylist = Listbox(basketFrame, yscrollcommand=scrollbar.set)
    for line in range(100):
        mylist.insert(END, "This is line number " + str(line))

    mylist.pack(side=LEFT, fill=BOTH)
    scrollbar.config(command=mylist.yview)


mainWindow = Tk()
mainFrame = Frame(mainWindow, bg="#94B3BD")
mainFrame.pack(fill="both", expand=True)
verticalFrame = Frame(mainFrame, bg="#94B3BD")

mainWindow.geometry("500x200")

welcomeMessage = tk.Label(verticalFrame, text="Welcome to the DIY Store Quote System", background="#94B3BD",
                          pady=40, font=("Arial", 25)).pack()
startButton = tk.Button(verticalFrame, highlightbackground='#B1E4EC', text="Begin Customising Wallpaper",
                        font=("Arial", 25),
                        pady=20, command=open).pack()
verticalFrame.pack()

mainWindow.mainloop()

这段代码应该可以解决问题:

import tkinter as tk

def addFrame(window, frames):
    frame = tk.Frame(window, width=50, height=50)
    label = tk.Label(frame, text = "New frame number {} wow!".format(len(frames)))
    label.pack()
    frame.pack()

    frames.append(frame)
    print("Those are all the frames:", frames)

my_frames = []

window = tk.Tk()
button = tk.Button(window, text = 'Add frame', command = lambda: addFrame(window, my_frames)) 
button.pack()
window.mainloop()
  • 每次按下按钮时,都会创建一个带有唯一标签的新框架。
  • 所有帧都存储在列表my_frames中供您访问。

您可以将滚动条添加到 canvas,然后使用 create_window 将框架添加到 canvas。然后,您可以向 myList.

添加更多帧
def createTab5(tab):

    yourBasketLabel = Label(tab, text="Your Basket", bg="#94B3BD",
                        font=("Times New Roman", 14)).place(x=50, y=50)

    basketFrame = Frame(tab, width=550, height=400)
    basketFrame.place(x=50, y=70)
    basketCanvas = Canvas(basketFrame, width=550, height=400)
    basketCanvas.pack(fill = "both", expand = True, side = "left")
    scrollbar = Scrollbar(basketFrame, command = basketCanvas.yview)
    scrollbar.pack(side=RIGHT, fill=Y)
    basketCanvas.config(yscrollcommand = scrollbar.set)
    basketCanvas.bind("<Configure>", resizeCanvas)
    myList = tk.Frame(basketCanvas)
    basketCanvas.create_window((4,4), window = myList, anchor = "nw")
    for line in range(100):
        frame = tk.Frame(myList)
        frame.pack()
        label = tk.Label(frame, text = "This is line number {}".format(str(line)))
        label.pack()
    scrollbar.config(command=basketCanvas.yview)

def resizeCanvas(event):
    canvas = event.widget
    canvas.update_idletasks()
    canvas.config(scrollregion = canvas.bbox("all"))