作者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://webptt.com/cn.aspx?n=bbs/Python/M.1594180901.A.19D.html
※ 编辑: yimean (114.33.116.8 台湾), 07/08/2020 12:02:58
1F:→ killua12703: 用class做tkinter 07/08 12:49
3F:→ stlevi811101: 影片後半部就是你的问题 所以改用class更系统化 07/09 07:44
5F:→ stlevi811101: Stack Overflow有位Bryan Oakley回答很多相关问题 07/09 07:47
6F:→ stlevi811101: 「Best way to structure a tkinter application?」 07/09 07:48
7F:→ yimean: 感恩K大与S大的指导。 07/09 08:27