2015-12-05 3 views
0

Моя программа - это редактор IFS, который имеет два окна: один для отображения фрактала, а другой для работы с соответствующим IFS. Последнее требует сетки записей, содержащих значения линейных преобразований. Поскольку мне нужно 24 записи (6 записей для каждого линейного преобразования и 4 преобразования), я определил вместо этого таблицу записей, использующую некоторые для циклов. Я знаю, что мне нужно установить textvariable в StringVar и использовать StringVar.set() для ввода некоторых значений по умолчанию, но когда я запускаю свою программу, записи все еще пусты.tkinter: значения по умолчанию не отображаются в записях даже с использованием 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() ничего не изменили). Сетки также отображаются правильно. Единственное, что неправильно, это то, что записи пусты. Что тут происходит?

Спасибо!

EDIT: Кажется, что проблема связана с двойными окнами. Сначала я определил FractalWindow, а значения по умолчанию для моих записей отображаются в FractalWindow, но не «окно». С другой стороны, если я сначала определяю «окно», появляются значения по умолчанию, но не для тех, что находятся в FractalWindow. Почему это происходит?

ответ

0

FunctionSetEntries [i] = FunctionSetEntries [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) 
+0

Это делает код более простым. Благодарю. Но у меня все еще такая же проблема. Он записывает их; Я использую function_entries [row * 6 + column] .get(), и он печатает значения. Однако номера по умолчанию не отображаются в самих виджетах. – user5644262

0

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

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

должен выполнить эту работу.

 Смежные вопросы

  • Нет связанных вопросов^_^