0

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

1 回答 1

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 中创建新窗口而设计,因此一切都可以留在同一个“沙箱”中并一起工作。

于 2019-10-04T12:22:37.807 回答