我想获得 Entrybox 和 Checkbutton 的价值,但我什么也得不到,为什么? (我是 tkinter 的新手)

I want to get value of Entrybox and Checkbutton but I get nothing why? (I am new to tkinter)

我想获取 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()

简短的答案:

在您的代码中,您需要将 m1 = Tk() 更改为 m1 = Toplevel()。这将解决您的问题。

长答案:

在编写 Tkinter GUI 时,99.99% 的时间你只会使用 1 个 tkinter 实例 Tk()。这样做的原因是 Tk() 的每个实例都包含在其自己的 "Sandbox" 中。这意味着它不能和其他人一起玩。因此 Tk() 的一个实例无法与单独的 Tk() 实例通信。

据我了解,如果您不指定方法在方法中属于哪个实例,那么它将默认为 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() 专为在 tkinter 中创建新 windows 而设计,因此所有内容都可以保持相同 "Sandbox" 并协同工作。