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

时间:2019-10-04 04:11:11

标签: python tkinter tkinter-entry tkinter.checkbutton

我想获取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 :(得分:0)

简短的答案:

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

长答案:

在99.99%的时间内编写Tkinter GUI时,您将只使用1个tkinter实例Tk()。这样做的原因是Tk()的每个实例都包含在其自己的个人“沙盒”中。意味着它不能与其他人一起玩。因此,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中创建新窗口而设计的,因此所有内容都可以保留在同一“沙盒”中并一起工作。