我正在尝试创建一组窗口来确定不同数量的xy坐标

时间:2015-08-10 16:15:12

标签: python python-3.x tkinter

我正在尝试创建一系列两个窗口,其中第一个将确定用户将输入的坐标数,第二个将允许用户输入此确切数量的坐标。

第一个弹出窗口的代码工作原理如下:

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列中放置一个值时,该列中的每个框都会填充该值,我希望每一行都是一组坐标。

1 个答案:

答案 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)