zoukankan      html  css  js  c++  java
  • 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() 

  • 相关阅读:
    基于live555实现的RTSPServer对底层进行性能优化的方法
    基于live555实现的RTSPServer对底层进行性能优化的方法
    EasyPlayerPro(Windows)流媒体播放器开发之框架讲解
    EasyPlayerPro(Windows)流媒体播放器开发之框架讲解
    EasyPlayerPro(Windows)流媒体播放器开发之跨语言调用
    EasyPlayerPro(Windows)流媒体播放器开发之跨语言调用
    EasyPlayerPro(Windows)流媒体播放器开发之接口设计
    EasyPlayerPro(Windows)流媒体播放器开发之接口设计
    EasyPlayerPro(Windows)流媒体播放器开发之ffmpeg log输出报错
    EasyPlayerPro(Windows)流媒体播放器开发之ffmpeg log输出报错
  • 原文地址:https://www.cnblogs.com/zijeak/p/11892242.html
Copyright © 2011-2022 走看看