Как мне выйти из ткинтера? - PullRequest
0 голосов
/ 11 февраля 2020

Не беспокойтесь о переменной, мне просто интересно, почему я не могу выйти из tkinter, чтобы создать новую.

def trainup():
    global newbw
    global mg
    global 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():
    import tkinter
    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()

1 Ответ

0 голосов
/ 11 февраля 2020

Есть несколько проблем с вашим кодом, которые вы должны устранить.

  1. import tkinter не должно быть в функции. Весь импорт должен быть в верхней части вашего кода. В настоящее время вы импортируете tkinter каждый раз, когда вызывается функция train().

  2. Главный вопрос для вас, почему вы не можете уничтожить root windows. Ваш экземпляр newbw tk определен локально в train(), поэтому ничто за пределами этой функции не может видеть эту переменную. Вам по крайней мере придется добавить global newbw к функции train(). Хотя лучший способ действий - это в любом случае переместить окно root в глобальное пространство имен или записать его как класс.

  3. mg не существует в вашем коде, поэтому это будет вызвать ошибки в этом примере.

  4. Вы действительно не должны удалять окно 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...