Tkinter关于新建窗口内Entry无法获取值(值全为空)的解决办法
最近在做Python的课程作业,遇到一个问题,描述如下:
使用Python内置的Tkinter模块进行GUI编程
给一个按钮(或菜单)绑定事件,打开一个新窗口,新窗口内有Entry若干,通过textvariable选项绑定变量,用于获取用户输入,但通过控制台输出(或方法参数传递)检查得知,程序获取到的数据全是空,即无任何有效内容被捕获。
源代码如下:
1 def new_restaurant(): 2 new_window=tk.Tk() 3 new_window.title("新建餐厅(New restaurant)") 4 new_window.geometry('700x500') 5 6 tk.Label(new_window,text='填写餐厅详细信息',font=("微软雅黑", 16)).grid(row=0,column=0,pady=5,padx=10) 7 8 e_name = tk.StringVar() 9 e_id = tk.StringVar() 10 e_borough = tk.StringVar() 11 e_coord_x = tk.StringVar() 12 e_coord_y = tk.StringVar() 13 e_street=tk.StringVar() 14 e_building=tk.StringVar() 15 e_zipcode=tk.StringVar() 16 e_cuisine=tk.StringVar() 17 18 tk.Label(new_window,text='餐厅名',font=("微软雅黑", 12)).grid(row=1,column=0) 19 tk.Entry(new_window,textvariable = e_name,font=("微软雅黑", 12)).grid(row=1,column=1,columnspan=2) 20 21 tk.Label(new_window,text='餐厅ID',font=("微软雅黑", 12)).grid(row=2,column=0) 22 tk.Entry(new_window,font=("微软雅黑", 12),textvariable =e_id).grid(row=2,column=1,columnspan=2) 23 24 tk.Label(new_window,text='所在地/自治市',font=("微软雅黑", 12)).grid(row=3,column=0) 25 tk.Entry(new_window,font=("微软雅黑", 12),textvariable=e_borough).grid(row=3,column=1,columnspan=2) 26 27 tk.Label(new_window,text='坐标',font=("微软雅黑", 12)).grid(row=4,column=0) 28 tk.Label(new_window,text=' X坐标',font=("微软雅黑", 12)).grid(row=4,column=1) 29 tk.Entry(new_window,font=("微软雅黑", 12),textvariable =e_coord_x,width=5).grid(row=4,column=2) 30 tk.Label(new_window,text=' Y坐标',font=("微软雅黑", 12)).grid(row=4,column=3) 31 tk.Entry(new_window,font=("微软雅黑", 12),textvariable =e_coord_y,width=5).grid(row=4,column=4) 32 33 tk.Label(new_window,text='街道',font=("微软雅黑", 12)).grid(row=5,column=0) 34 tk.Entry(new_window,font=("微软雅黑", 12),textvariable =e_street).grid(row=5,column=1,columnspan=2) 35 36 tk.Label(new_window,text='建筑号',font=("微软雅黑", 12)).grid(row=6,column=0) 37 tk.Entry(new_window,font=("微软雅黑", 12),textvariable =e_building).grid(row=6,column=1,columnspan=2) 38 39 tk.Label(new_window,text='邮政编码',font=("微软雅黑", 12)).grid(row=7,column=0) 40 tk.Entry(new_window,font=("微软雅黑", 12),textvariable =e_zipcode).grid(row=7,column=1,columnspan=2) 41 42 tk.Label(new_window,text='主菜',font=("微软雅黑", 12)).grid(row=8,column=0) 43 tk.Entry(new_window,font=("微软雅黑", 12),textvariable =e_cuisine).grid(row=8,column=1,columnspan=2) 44 save_button=tk.Button(new_window,text='保存(Save)',command=lambda : save_new(e_name.get(),e_borough.get(),e_coord_x.get(),e_id.get(),\ 45 e_coord_y.get(),e_street.get(),e_zipcode.get(),e_cuisine.get(),e_building.get(),\ 46 e_date1.get(),e_grade1.get(),e_score1.get(),\ 47 e_date2.get(),e_grade2.get(),e_score2.get(),\ 48 e_date3.get(),e_grade3.get(),e_score3.get(),\ 49 e_date4.get(),e_grade4.get(),e_score4.get(),\ 50 e_date5.get(),e_grade5.get(),e_score5.get()\ 51 )) 52 save_button.grid(row=16,column=1) 53 54 new_window.mainloop()
通过查询资料获得了解决办法,特记录如下:
错误原因:使用了tk.Tk()方法来新建窗口,这样得到的是一个新的根窗口,无法与原来的根窗口进行有效交互。
因此需要使用Toplevel组件新建顶级窗口,Toplevel 组件是一个独立的顶级窗口,这种窗口通常拥有标题栏、边框等部件,和 Tk() 创建出来的根窗口是一样的,共享着一样的方法。
解决办法:替换第二行代码 new_window=tk.Tk() 为 new_window=tk.Toplevel()