我正在尝试创建一系列两个窗口,其中第一个将确定用户将输入的坐标数,第二个将允许用户输入此确切数量的坐标。
第一个弹出窗口的代码工作原理如下:
root = Tk()
root.title("User Inputs")
mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)
numofcoord = StringVar()
numofcoord = ttk.Entry(mainframe, width=7, textvariable=numofcoord)
numofcoord.grid(column=2, row=1, sticky=(W, E))
ttk.Button(mainframe, text="OK", command=user_coordinates).grid(column=1, row=2, sticky=W)
ttk.Button(mainframe, text="CANCEL", command=quit).grid(column=2, row=2, sticky=W)
ttk.Label(mainframe, text="Number of Coordinates").grid(column=1, row=1, sticky=W)
for child in mainframe.winfo_children(): child.grid_configure(padx=5, pady=5)
root.mainloop()
第一部分有效,但在第二部分中,我的弹出窗口显示如下行,其中行数由第一个弹出窗口中的输入确定。
http://i.imgur.com/dToI2qX.png
第二部分的代码如下所示:
try:
noc = int(numofcoord.get())
root = Tk()
root.title("User Defined Coordinates")
mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)
x = StringVar()
y = StringVar()
ttk.Label(mainframe, text="X").grid(column=1, row=1, sticky=(W, E))
ttk.Label(mainframe, text="Y").grid(column=2, row=1, sticky=(W, E))
for i in range(2, noc + 2):
xcoord = ttk.Entry(mainframe, width=7, textvariable=x)
xcoord.grid(column=1, row=i, sticky=(W, E))
ycoord = ttk.Entry(mainframe, width=7, textvariable=y)
ycoord.grid(column=2, row=i, sticky=(W, E))
ttk.Button(mainframe, text="OK", command=test).grid(column=1, row=noc + 3, sticky=W)
ttk.Button(mainframe, text="CANCEL", command=quit).grid(column=2, row=noc + 3, sticky=W)
for child in mainframe.winfo_children(): child.grid_configure(padx=5, pady=5)
root.mainloop()
except ValueError:
pass
问题在于,当您在X或Y列中放置一个值时,该列中的每个框都会填充该值,我希望每一行都是一组坐标。
答案 0 :(得分:0)
问题是您的所有条目小部件共享相同的StringVar
。您需要为每个条目小部件创建StringVar
的新实例。但是,您根本不需要使用StringVar
。您真正需要做的就是保持对每个条目小部件的引用。
例如:
x_entries = []
y_entries = []
for i in range(2, noc + 2):
xcoord = ttk.Entry(mainframe, width=7)
xcoord.grid(column=1, row=i, sticky=(W, E))
ycoord = ttk.Entry(mainframe, width=7)
ycoord.grid(column=2, row=i, sticky=(W, E))
x_entries.append(xcoord)
y_entries.append(ycoord)
稍后,您可以获得如下值:
print("first pair: ", x_entries[0].get(), y_entries[0].get())
您可以使用StringVar
执行相同的操作,但在大多数情况下,通过为您提供更多管理对象而不会带来任何实际好处,这会增加复杂性。
以下是一个例子:
x_vars = []
y_vars = []
for i in range(2, noc + 2):
x = StringVar()
y = StringVar()
xcoord = ttk.Entry(mainframe, width=7, textvariable=x)
xcoord.grid(column=1, row=i, sticky=(W, E))
ycoord = ttk.Entry(mainframe, width=7, textvariable=y)
ycoord.grid(column=2, row=i, sticky=(W, E))
x_vars.append(x)
y_vars.append(y)