0

我的程序是一个 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 中,但不是“窗口”。另一方面,如果我先定义“窗口”,则会出现默认值,但不会出现在 FractalWindow 中。为什么会这样?

4

2 回答 2

0

FunctionSetEntries[i]=FunctionSetEntries[i]+[Tkinter.StringVar()] 将包含一个 StringVar() 6 次,每个“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)
于 2015-12-05T17:56:26.927 回答
0

好的,我想通了。我需要将我的一个窗口设置为 Toplevel() 。这使我能够在这两个地方使用 StringVar。所以像

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

应该做的工作。

于 2015-12-05T19:28:38.283 回答