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, но не в "окне". С другой стороны, если я сначала определю "окно", появятся значения по умолчанию, но не для значений в FractalWindow. Почему это происходит?

2 ответа

Хорошо, я понял это. Мне нужно было установить одно из моих окон как Toplevel(). Это позволяет мне использовать StringVar в обоих местах. Так что-то вроде

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

должен сделать работу.

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)
Другие вопросы по тегам