Я хочу использовать Tk() для своего нового окна, потому что я собираюсь уничтожить основное окно и позволить второму работать; однако, когда я его использую, он не позволяет обновлять текстовую переменную моей метки, но с простым изменением, например с использованием Toplevel(), это работает.
вот мой код:
from tkinter import *
from tkinter import ttk
def fill(s,c):
c += 1
the_bar['value'] = c
if c == 25:
text.set('text 2')
elif c == 50:
text.set('text 3')
elif c == 75:
text.set('text 4')
if c<=s:
loading_window.after(50,fill,s,c)
else:
the_bar.destroy()
loading_window.destroy()
def load():
global loading_window
loading_window = Tk()
loading_window.title('loading')
global text
text = StringVar()
text.set('text 1')
txt = Label(loading_window,textvariable=text)
txt.pack()
global the_bar
the_bar = ttk.Progressbar(loading_window,length=300,orient=HORIZONTAL,maximum=100)
the_bar.pack()
delay, steps, count = 50,100,0
loading_window.after(delay,fill,steps,count)
loading_window.mainloop()
load() #this is within a button in my main Tk() window






Не следует создавать несколько экземпляров Tk(), это объясняет, почему. По сути, созданный вами tk.StringVar привязан к первому экземпляру Tk() и недоступен из другого окна. Если вы хотите скрыть корневое окно, вы можете вызвать root.withdraw() и использовать toplevel() для другого окна.
tk.StringVar связан с первым Tk и является истинным, если вы не передадите что-то в качестве главного аргумента.
Как и в ответе выше, вам не следует использовать несколько отдельных окон Tk(). Но если вы настаиваете, пробовали ли вы зациклить второе окно?
Пример:
window1 = Tk()
window2 = Tk()
window1.mainloop()
window2.mainloop()
Пояснение: если вы не зацикливаете свои два окна, Tkinter не обновляется, потому что он не находится в цикле.
Вам не нужно (или не следует) выполнять mainloop() более одного раза. Также ваше предложение не касается проблемы ОП.
Но если существует несколько экземпляров tkinter Tk(), mainloop() необходим для активации всех переменных окна.
Нет, вам не нужно несколько mainloop() для нескольких экземпляров Tk(). Что вам нужно, так это указать экземпляр Tk() в качестве master переменной.
Если вы уничтожите первое окно перед созданием нового окна, такой проблемы не должно возникнуть. Или вы можете указать
masterтекстовой переменной при ее создании.