Есть несколько проблем с вашим кодом, которые вы должны устранить.
import tkinter
не должно быть в функции. Весь импорт должен быть в верхней части вашего кода. В настоящее время вы импортируете tkinter каждый раз, когда вызывается функция train()
.
Главный вопрос для вас, почему вы не можете уничтожить root windows. Ваш экземпляр newbw
tk определен локально в train()
, поэтому ничто за пределами этой функции не может видеть эту переменную. Вам по крайней мере придется добавить global newbw
к функции train()
. Хотя лучший способ действий - это в любом случае переместить окно root в глобальное пространство имен или записать его как класс.
mg
не существует в вашем коде, поэтому это будет вызвать ошибки в этом примере.
Вы действительно не должны удалять окно root и создавать его заново. Вместо этого вы должны управлять фреймом в окне root или в окне 2-го верхнего уровня.
Минимальное изменение, необходимое для работы этого кода:
import tkinter
def trainup():
global newbw, mg, pmg
# mg=mg+1
newbw.destroy()
# pmg = str(mg)
print("you have leveled up your money gain your new money gain will be:") # + pmg)
train()
def train():
global newbw
print("welcome to the training area")
print("click the button to train")
newbw = tkinter.Tk()
b = tkinter.Button(newbw, text="train", command=trainup)
b.pack()
newbw.mainloop()
train()
A Лучшим решением, вероятно, было бы обновить метку, а не пытаться воссоздать окно каждый раз.
Примерно так:
import tkinter as tk
def trainup():
global mg, pmg
mg += 1
pmg = str(mg)
status_label.config(text="you have leveled up your money gain your new money gain will be:" + pmg)
newbw = tk.Tk()
mg = 0
pmg = 0
tk.Label(newbw, text="welcome to the training area\nclick the button to train").pack()
status_label = tk.Label(newbw, text='')
status_label.pack()
tk.Button(newbw, text="train", command=trainup).pack()
newbw.mainloop()
Вот пример, где мы обновляем фрейм, содержащий виджет , Это не лучший вариант, но пример должен быть полезен в будущем.
import tkinter as tk
def trainup():
global mg, pmg
mg += 1
pmg = str(mg)
status_label.config(text="you have leveled up your money gain your new money gain will be:" + pmg)
def update_frame():
global frame, status_label
if frame is not None:
frame.destroy()
frame = tk.Frame(newbw)
frame.pack()
status_label = tk.Label(frame, text='')
status_label.pack()
newbw = tk.Tk()
mg = 0
pmg = 0
frame = None
update_frame()
tk.Label(newbw, text="welcome to the training area\nclick the button to train").pack()
tk.Button(newbw, text="train", command=trainup).pack()
newbw.mainloop()