2014-12-03 6 views
0

Я бы хотел, чтобы текст появлялся и обновлялся в каждом окне, а не только в одном. Я заметил, что окно, которое работает, всегда первое, что называется, но это не помогает мне решить проблему.Python 2.7 Tkinter - Обновление нескольких оконных записей

Еще одна вещь, которую я заметил, это то, что программа принимает ввод новых значений в окна, которые отображают значение в первую очередь, но любая попытка изменить значение de, введя значение во втором окне, терпит неудачу.

Вот упрощенная версия моего кода:

from Tkinter import * 

root = Tk() 
root2 = Tk() 
de= IntVar() 
de.set(0) 

def previous(): 
    de.set(de.get()-1) 

def Next(): 
    de.set(de.get()+1) 

def go_to(event) : 
    de.set(de.get()) 

button4 =Button(root2, text='Next', command=Next) 
button4.grid(row=26 ,column=9, columnspan=2, rowspan=1,padx=0, pady=0, sticky=W+E+N+S) 
button5 =Button(root2, text='Previous', command=previous) 
button5.grid(row=26, column=6, columnspan=2, rowspan=1,padx=0, pady=0, sticky=W+E+N+S) 

label1=Label(root2, text = 'Go to2') 
entry1 = Entry(root2,textvariable=de,bd=1,width=3) 
entry1.bind("<Return>", go_to) 
label1.grid(row=25, column=8, columnspan=1, rowspan=1,padx=0, pady=0) 
entry1.grid(row=26, column=8, columnspan=1, rowspan=1,padx=0, pady=0) 

button3 =Button(root, text='Next', command=Next) 
button3.grid(row=26 ,column=9, columnspan=2, rowspan=1,padx=0, pady=0, sticky=W+E+N+S) 
button2 =Button(root, text='Previous', command=previous) 
button2.grid(row=26, column=6, columnspan=2, rowspan=1,padx=0, pady=0, sticky=W+E+N+S) 

label=Label(root, text = 'Go to1') 
entry = Entry(root,textvariable=de,bd=1,width=3) 
entry.bind("<Return>", go_to) 
label.grid(row=25, column=8, columnspan=1, rowspan=1,padx=0, pady=0) 
entry.grid(row=26, column=8, columnspan=1, rowspan=1,padx=0, pady=0) 

root2.mainloop() 
root.mainloop() 

ответ

2

Основная причина проблемы заключается в том, что Tkinter не предназначен, чтобы иметь два корня окна. У этого есть некоторые неожиданные побочные эффекты, такие как то, что вы видите. Фактически вы можете думать о двух корневых окнах как о двух отдельных процессах или потоках, которые не могут обмениваться информацией. Ваш IntVar принадлежит к первому окну, но вы пытаетесь использовать его во втором.

Исправление состоит в том, чтобы никогда не создавать более одного экземпляра Tk. Если вам нужно больше окон, создайте экземпляры Toplevel. Таким образом, вы можете использовать один и тот же номер IntVar среди множества окон, сколько хотите.

+0

Отлично, вы избавили меня от неприятностей и на самом деле улучшили мое понимание, спасибо. –

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