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() 

posted @ 2019-11-19 20:41  槐城一只猫  阅读(3963)  评论(0编辑  收藏  举报