Tkinter .set и .get не работают в окне внутри окна - PullRequest
0 голосов
/ 17 марта 2019
from tkinter import *

def fun():
    trywindow=Tk()
    s=StringVar()
    entry=Entry(trywindow, textvariable=s)
    s.set("print")
    entry.pack()
    trywindow.mainloop()

root=Tk()
fun()

root.mainloop()

По моему после выполнения этого кода во 2-м окне должно появиться блок ввода с текстом, написанным в нем "PRINTED", но он пуст.

1 Ответ

0 голосов
/ 18 марта 2019

Как уже упоминалось в комментариях, использование нескольких экземпляров Tk() не рекомендуется.Это приводит к поведению, которого люди не ожидают, примером которого является этот вопрос.

Как объяснено в этого ответа , все случаи Tk полностью изолированы.Объекты, «принадлежащие» одному из них, нельзя увидеть или использовать в других.
Что происходит в вашем коде, так это то, что у вас есть два Tk экземпляра: root и trywindow.Затем вы создаете StringVar без каких-либо аргументов.Это обычный способ сделать это, но вы можете предоставить главный виджет во время создания.Таким образом, вы можете контролировать, к какому экземпляру Tk принадлежит ваш StringVar.См. Эту цитату из effbot :

Аргумент конструктора имеет значение только в том случае, если вы запускаете Tkinter с несколькими экземплярами Tk (чего не следует делать, если вы действительно не знаете, чтовы делаете).

Если вы не укажете мастера, мастер будет выбран неявно.Я верю, что это всегда первый созданный экземпляр Tk.В вашем случае StringVar создается с root в качестве мастера.Поскольку эти Tk экземпляры полностью разделены, trywindow и все виджеты в нем не могут "видеть" StringVar или любое значение в нем.

Таким образом, вы можете исправить свой код, просто передав trywindow в конструкцию SringVar:

s=StringVar(trywindow)

Однако, вероятно, проще изменить trywindow с экземпляра Tk на виджет Toplevel.Это также создает новое окно, но оно принадлежит к тому же экземпляру Tk, поэтому у вас нет этих трудностей с отдельными экземплярами Tk:

from tkinter import *

def fun():
    trywindow = Toplevel()
    s = StringVar()
    entry = Entry(trywindow, textvariable=s)
    s.set("print")
    entry.pack()
    trywindow.mainloop()

root = Tk()
fun()

root.mainloop()
...