Python 如何将动态添加的输入字段放置在不调整大小的集合框架或画布中

Python 如何将动态添加的输入字段放置在不调整大小的集合框架或画布中,python,tkinter,Python,Tkinter,我有动态可添加和可删除的输入字段,我想在主框架内的框架或画布内设置这些字段,但当我尝试时,框架会随着输入字段的增加而显示或动态增长。如果输入字段超过窗口大小,我希望画布使用滚动条 from tkinter import * import tkinter as tk class Demo2: def __init__(self, master): global rows self.master = master self.frame = tk.

我有动态可添加和可删除的输入字段,我想在主框架内的框架或画布内设置这些字段,但当我尝试时,框架会随着输入字段的增加而显示或动态增长。如果输入字段超过窗口大小,我希望画布使用滚动条

from tkinter import *
import tkinter as tk
class Demo2:
    def __init__(self, master):
        global rows

    self.master = master      
    self.frame = tk.Frame(self.master)
    master.title("test")

    self.frame.pack()
    addboxButton = Button(self.frame, text='<Add Time Input>', fg="Red", command=self.addBox)
    addboxButton.pack()
我现在正试图弄清楚如何在屏幕上打开第一组条目。并将add调用绑定到操作。
解决这一问题的通常方法是创建单个帧,并使用canvas
create\u window
方法将其添加到画布中。然后,您可以使用
pack
place
grid
将任何需要的内容放入框架中

有关该技术的说明,请参阅

下面的示例演示了该技术如何用于按钮创建的小部件。我没有包括删除功能,也没有为保持示例简短而适当调整大小的功能,但是您似乎对如何使删除功能工作有很好的想法,我不知道您想要什么样的调整大小行为

import tkinter as tk

class Demo2:
    def __init__(self, master):
        self.master = master
        self.entries = []

        self.canvas = tk.Canvas(master, width=400, height=200)
        self.vsb = tk.Scrollbar(master, orient="vertical", command=self.canvas.yview)
        self.canvas.configure(yscrollcommand=self.vsb.set)
        self.add_button = tk.Button(master, text="Add", command=self.add)
        self.container = tk.Frame()

        self.canvas.create_window(0, 0, anchor="nw", window=self.container)
        self.add_button.pack(side="top")
        self.vsb.pack(side="right", fill="y")
        self.canvas.pack(side="left", fill="both", expand=True)

        # start with 3 entry widgets
        self.add()
        self.add()
        self.add()

    def add(self):
        entry = tk.Entry(self.container)
        entry.pack(side="top", fill="x")
        self.canvas.configure(scrollregion=self.canvas.bbox("all"))

        self.entries.append(entry)

root = tk.Tk()
demo = Demo2(root)
root.mainloop()

为什么要为每个“盒子”创建一个新画布?此外,画布只能滚动使用
create\u window
创建的内容,因此使用
pack
添加框架将不允许滚动该框架。我不希望每个添加的条目都创建一个新的画布。这就是为什么我在这里要求一个指向正确方向的点。我现在正在尝试创建窗口,但当我单击“删除”时,它不会删除字段@brianOakleyOk我和你一起创建了一个窗口,它添加了它们,但是它把它们一个叠在另一个上面。我试着使用i=10,然后i+=20,我使用了20,因为这是所需的空间量,所以他们不会超过一圈。谢谢你的回复,我一回到我的电脑就去看看你的例子,我想我只是没有正确地表达我的问题。这让我在这里遇到了很多麻烦。这是非常接近谢谢你的链接,我试图看看我是否可以使它工作。在本例中,它从for语句填充字段。i=0,i+=1不会像以前那样改变我的行数。我将继续测试它,看看我是否可以让它工作。好的,从我可以告诉你的例子作为一个指导。我将画布移到顶部框架,而不是addbox。它有canvas.configure(scrollregion=canvas.bbox(“全部”))的部分是我删除这一行后,所有内容都显示了出来,但我仍然无法滚动。我的新条目被隐藏了。@Brandon:我用一个例子更新了我的答案。运行该示例并单击“添加”按钮几次,您应该会看到滚动条在有超过所需的条目时激活。我调整了您的代码,只是在切换到网格的添加(自)中添加了两个条目字段,并对行进行了计数。右边的“打包”按钮将在底部添加一些标签。再次感谢你的帮助,我只是想更好地理解这一点,我喜欢这样做。我还设置了只从一行开始的位置。
    i = 0
    ent1 = Entry(canvas)
    ent1.grid(row=i, column=0,sticky="nsew")
    i += 1
    i = 0
    ent2 = Entry(canvas)
    ent2.grid(row=i, column=1,sticky="nsew")
    i += 1        

    delboxButton = Button(canvas, text='delete', fg="Red", command=delete)
    delboxButton.grid(row=0 ,column=2)

root = tk.Tk()
root.title("test Complete")
root.geometry("500x500")
app = Demo2(root)
root.mainloop()
import tkinter as tk

class Demo2:
    def __init__(self, master):
        self.master = master
        self.entries = []

        self.canvas = tk.Canvas(master, width=400, height=200)
        self.vsb = tk.Scrollbar(master, orient="vertical", command=self.canvas.yview)
        self.canvas.configure(yscrollcommand=self.vsb.set)
        self.add_button = tk.Button(master, text="Add", command=self.add)
        self.container = tk.Frame()

        self.canvas.create_window(0, 0, anchor="nw", window=self.container)
        self.add_button.pack(side="top")
        self.vsb.pack(side="right", fill="y")
        self.canvas.pack(side="left", fill="both", expand=True)

        # start with 3 entry widgets
        self.add()
        self.add()
        self.add()

    def add(self):
        entry = tk.Entry(self.container)
        entry.pack(side="top", fill="x")
        self.canvas.configure(scrollregion=self.canvas.bbox("all"))

        self.entries.append(entry)

root = tk.Tk()
demo = Demo2(root)
root.mainloop()