如何从另一个输入框生成 "n" 行输入框?

How to generate "n" rows of Entry boxes from another Entry box?

我想从输入字段中获取一个整数并在其下方创建新的输入框。我已经编写了一个代码来使用按钮来做到这一点。但是,我想让它在我输入数字时自动发生而无需按钮,行会更新。

我看到一种自动化方法是使用 callback

from tkinter import *

root = Tk()
root.geometry("400x400")

n_para = IntVar()

label1 = Label(root, text="Numeric parameters")
label1.grid(row=0, column=0)

entry1 = Entry(root, textvariable=n_para)
entry1.grid(row=0, column=1)

def update():
    for i in range(1, n_para.get()+1):
        entryX = Entry(root)
        entryX.grid(row=i+1, column=0)

        entryY = Entry(root)
        entryY.grid(row=i+1, column=1)

        entryZ = Entry(root)
        entryZ.grid(row=i+1, column=2)

button1 = Button(root, text="update", command=update)
button1.grid(row=1, column=0)

root.mainloop()

因此,我使用 callback.

将代码更改为以下代码
from tkinter import *

root = Tk()
root.geometry("400x400")

n_para = IntVar()

label1 = Label(root, text="Numeric parameters")
label1.grid(row=0, column=0)

entry1 = Entry(root, textvariable=n_para)
entry1.grid(row=0, column=1)

def update(*args):
    try:
        for i in range(1, n_para.get()+1):
            entryX = Entry(root)
            entryX.grid(row=i+1, column=0)
            entryY = Entry(root)
            entryY.grid(row=i+1, column=1)
            entryZ = Entry(root)
            entryZ.grid(row=i+1, column=2)
    except ValueError:
        return

n_para.trace_add('write', update)

root.mainloop()

当我输入一个数字时,它起作用了,但出现了一个错误:_tkinter.TclError: expected floating-point number but got "",我不知道那是什么意思。

此外,该代码仅在我以升序格式输入数字时才有效。例如,如果我先输入 5,然后将其更改为 3,则不起作用。

您应该使用 StringVar 与条目相关联,因为条目包含文本。

StringVar 中有一个方法可以跟踪任何更改:StringVar().trace()。请参阅以下示例代码:

from tkinter import *

root = Tk()
root.geometry("400x400")

n_para = StringVar()

label1 = Label(root, text="Numeric parameters")
label1.grid(row=0, column=0)

entry1 = Entry(root, textvariable=n_para)
entry1.grid(row=0, column=1)

def update(*args):
    print('update', n_para.get())

n_para.trace('w', update)   # Trace changes in n_para and run update if detected

root.mainloop()

您收到的错误是因为条目包含文本。在使用之前,您必须将其转换为 int。

新例子

您可以通过多种方式做到这一点,但这里有一个例子:

from tkinter import *

root = Tk()
root.geometry("400x400")

n_para = StringVar()

label1 = Label(root, text="Numeric parameters")
label1.grid(row=0, column=0)

entry1 = Entry(root, textvariable=n_para)
entry1.grid(row=0, column=1)

row_list = []       # List of all currently displayed entry rows
                    # and each row is a list of entrys within this list

def update(*args):
    try:
        para = int(n_para.get())
    except ValueError:
        return      # Return without changes if ValueError occurs
    
    rows = len(row_list)
    diff = para - rows  # Compare old number of rows with entry value
    if diff == 0:
        return      # Return without changes
    
    elif diff > 0:      # Add rows of entrys and remember them
        for row in range(rows+1, rows+diff+1):
            entry_list = []   # Local list for entrys on this row
            for col in range(3):
                e = Entry(root)
                e.grid(row=row, column=col)
                entry_list.append(e)    # Add entry to list
            row_list.append(entry_list) # Add entry list to row
    
    elif diff < 0:      # Remove rows of entrys and froget them
        for row in range(rows-1, rows-1+diff, -1):
            for widget in row_list[row]:
                widget.grid_forget()
                widget.destroy()
            del row_list[-1]

n_para.trace('w', update)   # Trace changes in n_para

root.mainloop()

这是你的想法吗?