Причина в том, что вы создаете несколько экземпляров Tk и не уничтожаете экземпляры, когда закончите с ними. Это вызывает две проблемы. Во-первых, утечка памяти. Каждый раз, когда вы вызываете одну из этих функций, вы создаете новое окно и новый интерпретатор tcl.
Вторая проблема заключается в том, что первое окно root становится окном по умолчанию, если root не указано. Когда вы создаете StringVar
во второй функции, поскольку вы не указали, какому окну root оно принадлежит, оно будет назначено первому окну root. Когда вы используете его как цель textvariable
во втором экземпляре Tk
, tkinter думает, что переменная не существует, поэтому создает новую для второго окна. Однако ваша ссылка по-прежнему относится к тому, что создано в первом root окне, и никогда не обновляется при вводе пользователем во втором окне.
Смущает? Да, именно поэтому вам обычно не следует создавать более одного экземпляра Tk
.
, чтобы ваш код работал с как можно меньшим количеством изменений и для устранения утечки памяти, вызванной не разрушением windows, вы можете изменить последние пару строк в своем методе, чтобы они выглядели следующим образом. Это разрушает окно root, когда вы закончите с ним, устраняя утечку памяти и побочный эффект наличия более одного окна root.
root = Tk()
...
root.mainloop()
value = path.get()
root.destroy()
return value
Второй диалог должен выглядеть примерно так:
root = Tk()
...
root.mainloop()
value = name.get()
root.destroy()
return value
Это извлекает значение после выхода mainloop
, но до удаления базового интерпретатора tcl, а затем уничтожает окно и его tcl.
В следующий раз, когда вы создадите экземпляр Tk
, этот экземпляр станет новым значением по умолчанию root, а любой новый экземпляр StringVar
будет go с этим root.
Другим решением было бы указать мастер для экземпляра StringVar
, но это оставляет утечку памяти на месте, так что это только половина решения.
Возможно, лучшим решением является создание одно окно root и либо повторно используйте его, либо создайте экземпляры Toplevel
вместо Tk
. Effbot имеет неплохую документацию о том, как создать модальное окно с wait_window
.