看板 Python 關於我們 聯絡資訊
各位版上的高手早上好。 我這邊在撰寫GUI的時候遇到了一個創建元件必須用Global的問題,我的程式結構如下。 這只是我的程式片段,無法執行的。 def main_GUI(): window=tk.Tk() window.title('東山模具社--模具管理系統(V%s)'%VC) window.geometry('800x600') #定義視窗大小 #------規格搜尋GUI--------- def Sub_OM_generator(*args): #依據部位不同產生下拉式選單 forget_all_widget()#避免上一次變動沒有清除到,殘留在視窗上。 if Selected_part.get() == "下切": Selected_Tuple=Cut_OM_Tuple elif Selected_part.get() =="靠模盤": Selected_Tuple=Plate_OM_Tuple for index_r in range(2,(len(Selected_Tuple)+2)): #為了要讓元件名稱和位置相呼應方便管理Offset +2個Row globals()['Label'+str(index_r)+str(0)]=tk.Label(Specinfo,text= Selected_Tuple[index_r-2]) #Select_Tuple 的指標必須要減2因應前一行的Offset措施。 globals()['Label'+str(index_r)+str(0)].grid(row=(index_r),column= 0,sticky=tk.W) for index_c in range(1,4): globals()['Entry'+str(index_r)+str(index_c)]=tk.Entry(Specinfo ,width=10) globals()['Entry'+str(index_r)+str(index_c)].grid(row=(index_r) ,column=(index_c),sticky=tk.W) global _Specinfo_WN _Specinfo_WN=index_r #Specinfo fram 最後一個自動產生的元件流水號。 Central_Label.grid(row=1,column=1) Upper_Label.grid(row=1,column=2) Lower_Label.grid(row=1,column=3) Confirm_btn.grid(row=_Specinfo_WN+1,column=2) #把確認按鈕跟清除資料的按鈕放在最下面。 Clean_btn.grid(row=_Specinfo_WN+1,column=3) def Specinfo_search_btn():#按下搜尋按鈕要執行的事情 table_name=Selected_part.get() #取得Table name input_list=[] for index_r in range(2,(_Specinfo_WN+1)): #從第二行開始抓資料,因應Offset的做法。 input_list.append(globals()['Label'+str(index_r)+str(0)].cget ("text")) #cget取得Label的內容 for index_c in range(1,4): input_list.append(globals()['Entry'+str(index_r)+str(index_c)] .get()) #將Entry的值放進List裡面 sqlite_command=sqlite_search_command_generator(table_name,input_list) #產生查詢命令 column_name,dimension=Retrive_column_name_from_sqlite(DB_name,table_ name) #取得欄位資料 data=Retrieve_data_from_sqlite(DB_name,sqlite_command) #從Sqlite取得資料 data_on_treeview(column_name, data, dimension)#把資料放進treeview Specinfo_label1=tk.Label(Specinfo,text="模具部位",font="標楷體 12") #把一定要建立的物件放主Function底下,可以避免用Global函數。 Central_Label=tk.Label(Specinfo,text="中心值",anchor='center') Upper_Label=tk.Label(Specinfo,text="正公差",anchor='center') Lower_Label=tk.Label(Specinfo,text="負公差",anchor='center') Selected_part=tk.StringVar(Specinfo) Part_OptionMenu=tk.OptionMenu(Specinfo, Selected_part, *Part_OM_Tuple) #顯示選項,未來可以用變數處理。 Confirm_btn=tk.Button(Specinfo,text="查詢",font="標楷體 12",command=Specinfo_search_btn) Clean_btn=tk.Button(Specinfo,text="清除所有條件",font="標楷體 12",command=forget_all_widget) Specinfo_help_btn=tk.Button(Specinfo,text="說明文件",font="標楷體 12",command=lambda:display_PDF(Specinfo_help)) Specinfo_label1.grid(row=0,column=0) Part_OptionMenu.grid(row=0,column=1) Selected_part.trace("w",Sub_OM_generator) #當下拉式選單狀態改變時就呼叫下拉式選單產生器 執行的畫面如下 https://imgur.com/hXUnpfB https://imgur.com/kFUZhKU https://imgur.com/DBGmenN 在執行def Sub_OM_generator(*args)這個Function 的時候我必須要用Global()才能創建Label跟EntryBox 請問高手這個有辦法解決嗎? 還是只能這樣搞? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.33.116.8 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1594180901.A.19D.html ※ 編輯: yimean (114.33.116.8 臺灣), 07/08/2020 12:02:58
killua12703: 用class做tkinter 07/08 12:49
stlevi811101: https://youtu.be/RkaekNkIKNY 07/09 07:40
stlevi811101: 影片後半部就是你的問題 所以改用class更系統化 07/09 07:44
stlevi811101: https://i.imgur.com/mPM1mmm.png 官方文檔範例 07/09 07:44
stlevi811101: Stack Overflow有位Bryan Oakley回答很多相關問題 07/09 07:47
stlevi811101: 「Best way to structure a tkinter application?」 07/09 07:48
yimean: 感恩K大與S大的指導。 07/09 08:27