tkinter:即使使用StringVar(),默认值也不会出现在条目中



我的程序是一个IFS编辑器,它有两个窗口:一个用于显示分形,另一个用于处理相应的IFS。后者需要一个包含线性变换值的条目网格。由于我需要24个条目(每个线性变换6个条目,4个变换),因此我使用一些for循环定义了一个条目表。我知道我必须将textvariable设置为StringVar,并使用StringVar.set()来输入一些默认值,但当我运行程序时,这些条目仍然是空的。

这就是我所拥有的。这里的"矩阵"是一个4x6的浮动矩阵:

FunctionEntries=[[],[],[],[]]
FunctionSetEntries=[[],[],[],[]]
for i in range(4):
    for j in range(6): 
        FunctionSetEntries[i]=FunctionSetEntries[i]+[Tkinter.StringVar()]
        k=Tkinter.Entry(window, width="5", textvariable = FunctionSetEntries[i][j])
        FunctionSetEntries[i][j].set(matrices[i][j])
        FunctionEntries[i]=FunctionEntries[i]+[k]
        FunctionEntries[i][j].grid(row=3+i,column=j+1)
    FunctionEntries=FunctionEntries+[FunctionEntries[i]]    

奇怪的是,当我单独定义一些其他条目时,一切都很好

P=[0.85,0.07,0.07,0.01]
probs1=Tkinter.StringVar()
probs1.set(P[0])
probs2=Tkinter.StringVar()
probs2.set(P[1])
probs3=Tkinter.StringVar()
probs3.set(P[2])
probs4=Tkinter.StringVar()
probs4.set(P[3])
probLabel=Tkinter.Label(FractalWindow, width="15")
probLabel.configure(text="probabilities= ")
probEntry1=Tkinter.Entry(FractalWindow, width= "5", textvariable = probs1)
probEntry2=Tkinter.Entry(FractalWindow, width= "5", textvariable = probs2)
probEntry3=Tkinter.Entry(FractalWindow, width= "5", textvariable = probs3)
probEntry4=Tkinter.Entry(FractalWindow, width= "5", textvariable = probs4)

最后几次是在另一个窗口,所以这是问题的一部分吗?但据我所知,两个窗口的其他一切都很好。我也看不出我在这里所做的和在前一个案例中所做的有任何区别(条目定义和.set()的顺序没有改变任何东西)。栅格也会正确显示。唯一的错误是条目是空的。这是怎么回事?

谢谢!

编辑:双层窗户好像有问题。我首先定义了FractalWindow,我的条目的默认值显示在FractalWindow中,但不是"window"。另一方面,如果我首先定义"窗口",则会显示默认值,但不会显示FractalWindow中的默认值。为什么会发生这种情况?

FunctionSetEntries[i]=FunctionSetEntries[i]+[Tkinter.StringVar()]将包含6次StringVar((),每个"j"一个。如果一开始使用一个包含24个条目的列表,为了简单起见,您只需执行以下操作(请注意,您只需要保留对Entry或StringVar的引用,而不需要同时保留对两者的引用,即可获取/设置内容)。

function_entries=[]
for i in range(4):
    for j in range(6): 
        s_var=Tkinter.StringVar()
        function_entries.append(s_var)
        Tkinter.Entry(window, width="5", textvariable = s_var).grid(etc)
## proof of concept when not using a nested list
for num in range(24):
    row, column=divmod(num, 6)
    print num, row, column
for row in range(4):
    for column in range(6):
        print "list offset for %d, %d = %d" % (row, column, row*6+column)

好的,我想明白了。我需要将其中一个窗口设置为Toplevel()。这使我能够在这两个地方都使用StringVar。所以类似的东西

window=Tkinter.tk() 
FractalWindow=Tkinter.Toplevel()

应该做这项工作。

最新更新