Я хочу получить значение Entrybox и Checkbutton, но ничего не понимаю, почему? (Я новичок в ткинтер) - PullRequest
0 голосов
/ 04 октября 2019

Я хочу получить значение Entrybox и Checkbutton, но ничего не понимаю, почему? (Я новичок в tkinter)

from tkinter import *

def m1():
    m1 = Tk()
    entry_val = StringVar()
    check_val = IntVar()
    Entry(m1, textvariable=entry_val).pack()
    Checkbutton(m1, text='CheckButton', variable=check_val).pack()

    def show():
        print(entry_val.get())
        print(check_val.get())

    Button(m1, text='click!', command=show).pack()
    m1.mainloop()


def main():
    main = Tk()

    Button(main, text='click! (main)', command=m1).pack()
    main.mainloop()


main()

1 Ответ

0 голосов
/ 04 октября 2019

Короткий и простой ответ:

В вашем коде вам нужно изменить m1 = Tk() на m1 = Toplevel(). Это решит вашу проблему.

Длинный ответ:

При написании графического интерфейса пользователя Tkinter 99,99% времени вы будете использовать только 1 экземпляр tkinter Tk(). Причина этого заключается в том, что каждый экземпляр Tk() содержится в своей собственной «Песочнице». То есть он не может играть с другими. Таким образом, один экземпляр Tk() не может взаимодействовать с отдельным экземпляром Tk().

Насколько я понимаю, если вы не укажете, к какому экземпляру принадлежит метод в методе, он будет по умолчанию установлен на 1-й экземплярTk(). Таким образом, созданные вами StringVar() и IntVar() не могут быть напечатаны, поскольку они принадлежат main. Поскольку main не может общаться с m1, вы не можете обновить это значение.

Мы можем на самом деле проверить это, если вы измените:

entry_val = StringVar()
check_val = IntVar()

На:

entry_val = StringVar(m1)
check_val = IntVar(m1)

Вы увидите, что ваши переменные обновляются правильно.

Или, если вы измените m1 = Tk() на m1 = Toplevel() (правильное решение), вы увидите, что все работает как нужно.

Toplevel() isспециально разработан для создания новых окон в tkinter, чтобы все могло оставаться в одной «песочнице» и работать вместе.

...