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

时间:2017-03-09 15:52:27

标签: python tkinter

我有动态可添加和删除能够输入的字段,我想在主框架内的框架或画布内设置但是当我尝试框架消失或随着输入字段动态增长。如果输入字段超出窗口大小,我希望画布使用滚动条。

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()

这是添加和删除我的按钮的地方。

def addBox(self):         
    def delete():
        delboxButton.grid_remove()
        ent1.delete(0,END)
        ent2.delete(0,END)
        ent1.grid_remove()
        ent2.grid_remove()
    root = self.frame
    frame=Frame(root,width=900,height=900)
    frame.pack()
    canvas=Canvas(frame,bg='#FFFFFF',width=700,height=300,scrollregion=(0,0,700,300))
    vbar=Scrollbar(frame,orient=VERTICAL)
    vbar.pack(side=RIGHT,fill=Y)
    vbar.config(command=canvas.yview)
    canvas.config(width=700,height=300)
    canvas.config(yscrollcommand=vbar.set)
    canvas.pack(side=LEFT,expand=TRUE,fill=BOTH)

我正在试图弄清楚如何让第一组条目在屏幕打开时开始。并将add调用绑定到一个操作。

    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()

1 个答案:

答案 0 :(得分:0)

解决此问题的正常方法是创建单个框架并使用canvas create_window方法将其添加到画布。然后,您可以使用packplacegrid在框架中放置您想要的任何内容。

有关该技术的说明,请参阅Adding a scrollbar to a group of widgets in Tkinter

这是一个示例,说明该技术如何适用于按钮创建的小部件。我没有包含删除功能或能够正确调整大小以保持示例简短的能力,但您似乎非常清楚如何使删除功能工作,我不知道究竟是什么类型的调整大小你想要的行为。

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()