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()
答案 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中创建新窗口而设计的,因此所有内容都可以保留在同一“沙盒”中并一起工作。