Tkinter无法访问Toplevel窗口内创建的Entry控件问题
问题根源
这个报错和Toplevel窗口没有任何关系,是Tkinter的基础语法特性导致的:
- Tkinter所有控件的
pack()、grid()、place()三个布局方法,返回值固定为None - 你写
entryrows=Entry(popup,width=5).place(x=160,y=130)时,逻辑是先创建Entry控件实例,立刻调用place方法完成布局,最后把place方法的返回值(也就是None)赋值给entryrows变量。变量根本没有保存Entry控件的实例,调用insert、get方法时自然会抛出'NoneType' object has no attribute 'insert'错误。
你之前在普通窗口使用Entry没出问题,只是当时没有把控件创建和布局调用链式写在一行赋值而已。
修复方案
把控件创建和布局操作拆成两行独立执行:先用变量接收创建好的控件实例,再单独调用布局方法设置位置。按照这个写法,不管控件放在根窗口还是Toplevel窗口,都可以正常访问、操作。
修正后的可运行代码:
from tkinter import * window = Tk() window.geometry('1000x580') popup = Toplevel(window) popup.geometry("300x400") # 拆分创建控件和布局的步骤 entrycolumns = Entry(popup, width=5) entrycolumns.place(x=100, y=130) entryrows = Entry(popup, width=5) entryrows.place(x=160, y=130) # 现在可以正常操作控件 entryrows.insert(0, "test") print(entryrows.get()) window.mainloop()
额外提示:Tkinter程序只需要对根窗口调用一次
mainloop()即可,不需要给Toplevel顶级窗口单独调用mainloop,多余的事件循环调用反而可能引发交互异常。
内容的提问来源于stack exchange,提问作者Lion In A Box
相关产品推荐
相关产品推荐

