Tkinter:记录由按钮动态创建的条目

时间:2018-06-29 14:48:29

标签: python-3.x tkinter

我试图通过单击某种“ +”按钮允许用户输入任意数量的字符串,并将字符串保留在列表中。 (他输入第一个字符串,单击“ +”,出现另一个输入框,依此类推。)

目前,这是我所拥有的:

def addEntry(window, r, e):
    if r < 9:
        global entries
        entries.append(e.get())
        r += 1
        e = tk.Entry(window)
        e.grid(column=1, row=r)
        add = tk.Button(window, text=' + ', command=lambda:addEntry(window, r, e))
        add.grid(column=2, row=r, sticky=tk.W)
    else:
        errmsg = 'Max. 10 items'
        tk.Label(window, text=errmsg).grid(column=1, row=r+1)


import tkinter as tk

global entries # the main list of strings
entries = []
r = 0 # index for rows ; will not be 0 in the final code as there will be other widgets

win = tk.Tk()

e = tk.Entry(win)
e.grid(column=1, row=r)
add = tk.Button(win, text=' + ', command=lambda:addEntry(win, r, e))
add.grid(column=2, row=r, sticky=tk.W)

win.mainloop()

这不是很优雅,并且不会记录最后一个条目。

我尝试使entries成为Entry()项(而不是e.get()项)的列表,但是后来我无法访问字符串(TclError: invalid command name ".!entry4")。我尝试模拟this,这使我使entries成为全局变量;我尝试使用this,但我不完全理解第一个答案,据我所知,没有记录字符串;我尝试调整第二个答案中定义的类,但是无法动态添加按钮。 (不过,我喜欢上课的想法。)我觉得我应该能够做到,但是在浪费一天的时间之后,不妨寻求帮助。

1 个答案:

答案 0 :(得分:0)

不要将放在列表中,而是放置实际的小部件。仅在实际需要这些值时才应调用get方法。

此外,我强烈建议您将条目放在专用框架中。这样,您不必担心窗口中可能还有其他小部件,也不必处理行号和列号。将它们放在框架中,并使用pack,因为它们是从上到下堆叠的,并且都具有相同的大小。

示例:

import tkinter as tk

def addEntry(window):
    global entries
    if len(entries) > 10:
        error_message.configure(text="Max. 10 items")
    else:
        error_message.configure(text="")
        entry = tk.Entry(window)
        entry.pack(side="top", fill="x")
        entries.append(entry)

def show():
    for entry in entries:
        print("=>", entry.get())


entries = []

win = tk.Tk()

entry_frame = tk.Frame(win)
error_message = tk.Label(win)
error_message.grid(row=1, column=0, sticky="nsew")

add = tk.Button(win, text=' + ', command=lambda: addEntry(entry_frame))
show = tk.Button(win, text="Show values", command=show)

add.grid(row=0, column=1, sticky=tk.NW)
show.grid(row=0, column=2, sticky=tk.NW)
entry_frame.grid(row=0, column=0, sticky="nsew")

# create the first entry automatically
addEntry(entry_frame)

win.mainloop()