Почему использование Tk() вместо Toplevel() для моего второго окна в Tkinter не позволяет мне обновить текстовую переменную в метке

Я хочу использовать 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

Если вы уничтожите первое окно перед созданием нового окна, такой проблемы не должно возникнуть. Или вы можете указать master текстовой переменной при ее создании.

acw1668 25.07.2024 02:44
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
69
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Не следует создавать несколько экземпляров Tk(), это объясняет, почему. По сути, созданный вами tk.StringVar привязан к первому экземпляру Tk() и недоступен из другого окна. Если вы хотите скрыть корневое окно, вы можете вызвать root.withdraw() и использовать toplevel() для другого окна.

tk.StringVar связан с первым Tk и является истинным, если вы не передадите что-то в качестве главного аргумента.

TheLizzard 26.07.2024 00:48

Как и в ответе выше, вам не следует использовать несколько отдельных окон Tk(). Но если вы настаиваете, пробовали ли вы зациклить второе окно?

Пример:

window1 = Tk()
window2 = Tk()

window1.mainloop()
window2.mainloop()

Пояснение: если вы не зацикливаете свои два окна, Tkinter не обновляется, потому что он не находится в цикле.

Breadification 25.07.2024 05:35

Вам не нужно (или не следует) выполнять mainloop() более одного раза. Также ваше предложение не касается проблемы ОП.

acw1668 25.07.2024 05:44

Но если существует несколько экземпляров tkinter Tk(), mainloop() необходим для активации всех переменных окна.

Breadification 25.07.2024 05:49

Нет, вам не нужно несколько mainloop() для нескольких экземпляров Tk(). Что вам нужно, так это указать экземпляр Tk() в качестве master переменной.

acw1668 25.07.2024 05:53

Другие вопросы по теме