О tkinter StringVar () - PullRequest
       6

О tkinter StringVar ()

0 голосов
/ 06 января 2019

У меня проблема с tkinter StrinVar (), и я не очень разбираюсь в tkinter и хотел бы помочь, спасибо.

Что я сделал, так это то, что я создал два окна, в каждом из которых есть виджет «Ввод» и виджет «Кнопка», если вы нажмете кнопку одного окна, тогда это окно будет выведено, и появится другое окно, и если вы нажмете кнопку в этом всплывающем окне, то он выводится и появляется всплывающее окно. Вот код: -

from tkinter import *
def x():
    a1.set("")
    a.withdraw()
    b.deiconify()
def y():
    b1.set("")
    b.withdraw()
    a.deiconify()
a=Tk()
a.withdraw()
a1=StringVar()
b1=StringVar()
Entry(a,textvariable=a1).pack()
Button(a,text="button1",command=x).pack()
a.withdraw()
b=Tk()
Entry(b,textvariable=b1).pack()
Button(b,text="button2",command=y).pack()
mainloop()

если вы что-то напишите в виджете ввода и нажмете кнопку2, появится второе окно, затем снова, если вы напишите что-нибудь в виджете ввода и нажмете кнопку1, поле ввода не обновляется в предыдущем первом окне.

я обнаружил, что кто-то предположил, что не должно быть двух экземпляров Tk() у tkinter должен быть только один экземпляр Tk() для многократного использования окна Toplevel(). Итак, я изменил b=Tk() на b=Toplevel(), который работает нормально, а StringVar() обновлял значение

Теперь мой вопрос таков: 1) В чем причина / логика отсутствия обновления StingVar() с двумя экземплярами Tk() 2) есть ли способ заставить StringVar() обновить значение с двумя экземплярами Tk()

1 Ответ

0 голосов
/ 06 января 2019

"Tkinter - это просто оболочка Python для встроенного интерпретатора Tcl, который импортирует библиотеку Tk. Когда вы создаете корневое окно, вы создаете экземпляр интерпретатора Tcl.

Каждый интерпретатор Tcl представляет собой изолированную песочницу. Объект в одной песочнице не может взаимодействовать с объектами в другой. Наиболее распространенным проявлением этого является то, что StringVar, созданный в одном интерпретаторе, не виден в другом. То же самое относится и к виджетам - вы не можете создавать виджеты в одном интерпретаторе, которые имеют родительский виджет в другом интерпретаторе.

С технической точки зрения нет причин, по которым вы не можете иметь два экземпляра Tk одновременно. Рекомендация против этого заключается в том, что редко существует реальная необходимость иметь два или более различных интерпретатора Tcl, и это вызывает проблемы, которые трудно понять начинающим.

Лучшее решение в 99,9% случаев - создать ровно один экземпляр Tk, который вы используете для жизни своей программы. Проще говоря, именно так был разработан tkinter и основной интерпретатор Tcl / Tk для использования. "--- С Брайан Оукли на Почему не рекомендуется использовать несколько экземпляров Tk?

# 1 Итак, когда вы создаете a=Tk(), а затем b=Tk() StringVar a1, b1 доступно в b=Tk(), но не в a=Tk(). поэтому значение не обновляется в a=Tk().

# 2 Как указано выше, «StringVar, созданный в одном интерпретаторе, не виден в другом». Поэтому нет способа заставить StringVar () обновлять значение, имея два экземпляра Tk ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...