我试图通过单击某种“ +”按钮允许用户输入任意数量的字符串,并将字符串保留在列表中。 (他输入第一个字符串,单击“ +”,出现另一个输入框,依此类推。)
目前,这是我所拥有的:
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,但我不完全理解第一个答案,据我所知,没有记录字符串;我尝试调整第二个答案中定义的类,但是无法动态添加按钮。 (不过,我喜欢上课的想法。)我觉得我应该能够做到,但是在浪费一天的时间之后,不妨寻求帮助。
答案 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()