最近在做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()