当我向单个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()
答案 0 :(得分:1)
问题的根源在于您没有正确初始化StringVar
。如果仔细观察,您会发现您的列表包含对text = [tk.StringVar() for i in range(3)]
的单个实例的三个引用。
然后,一个解决方案是正确初始化列表。例如:
StringVar
另一种解决方案是不使用textvariable
和textvariable
。在大多数情况下,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实例,则每个窗口小部件将获得不同的值。