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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM