作者yimean (溫柔殺手)
看板Python
標題[問題] Tkinter跨Funciton呼叫問題
時間Wed Jul 8 12:01:39 2020
各位版上的高手早上好。
我這邊在撰寫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: 影片後半部就是你的問題 所以改用class更系統化 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