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

2024-04-20 09:43:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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

这就是我所拥有的。这里的“矩阵”是一个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中的那些值则不会。为什么会这样?你知道吗


Tags: for定义tkinter条目widthentrysettextvariable
2条回答

FunctionSetEntries[i]=函数集条目[i]+[Tkinter.StringVar文件()]将包含一个StringVar()6次,每个“j”一次。为了简单起见,如果您使用一个包含24个条目的列表,那么您只需执行以下操作(请注意,您只需保留对条目或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()

我应该做这项工作。你知道吗

相关问题 更多 >