当我向单个ttk.entry输入文本时,数组中的每个其他ttk.entry都会更改为相同的值。我究竟做错了什么?

时间:2016-09-26 20:50:30

标签: python-3.x tkinter

当我向单个ttk.entry输入文本时,数组中的每个其他ttk.entry都会更改为相同的值。我究竟做错了什么? 这是我的简化代码:

from tkinter import *
from tkinter import ttk

root = Tk()
root.title("test")
mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))


text = [StringVar()]*3
textbox = [None]*3
for x in range(1, 3):
    textbox[x] = ttk.Entry(mainframe, textvariable=text[x])
    textbox[x].grid(column=1, row=x, sticky=(W, E))
text[1].set("1")
text[2].set("2")

for child in mainframe.winfo_children(): child.grid_configure(padx=5, pady=5)
root.mainloop()

2 个答案:

答案 0 :(得分:1)

问题的根源在于您没有正确初始化StringVar。如果仔细观察,您会发现您的列表包含对text = [tk.StringVar() for i in range(3)] 的单个实例的三个引用。

然后,一个解决方案是正确初始化列表。例如:

StringVar

另一种解决方案是不使用textvariabletextvariable。在大多数情况下,textvariable属性是可选的。您需要使用textvariable的唯一时间是您希望将两个或多个小部件链接在一起,或者您想要在变量上添加跟踪时。由于看起来你没有做这些,我建议不要使用{{1}}选项。

答案 1 :(得分:0)

当您创建StringVar的列表时,您正在创建一个包含对同一实例的3个引用的列表。

>>> vals = [tk.StringVar()] * 3
>>> vals
[<tkinter.StringVar object at 0x7f0623fcfa90>, <tkinter.StringVar object at 0x7f0623fcfa90>, <tkinter.StringVar object at 0x7f0623fcfa90>]

请注意,地址完全相同。你想要3个不同的实例。例如:

>>> [tk.StringVar() for x in range(0,3)]
[<tkinter.StringVar object at 0x7f06213105f8>, <tkinter.StringVar object at 0x7f0621310668>, <tkinter.StringVar object at 0x7f0621310710>]

会这样做。由于您有一个实例,所有小部件都反映了该实例的值。如果使用单独的StringVar实例,则每个窗口小部件将获得不同的值。