[记]tkinter基于LabelFrame继承的自定义组件与tkinter变量的传递
参考:python - 继承最佳实践 : *args, **kwargs 或明确指定参数 - IT工具网 (coder.work)
前言:tkinter属性值的传递是使用可变参数*args和**kwargs进行传递和属性设置的,所以继承时需将这些可变参数进行继承:
time:20220315
import tkinter as tk #bili:崩析 博客园:戳人痛处 class Wgt(tk.LabelFrame): def __init__(self,*args,StrVarList:tk.StringVar,**kwargs): super().__init__(*args,**kwargs) self.StrVarList=StrVarList self.Show() def Show(self): for idx in self.StrVarList: tk.Label(self,textvariable=idx).pack(expand=1,fill=tk.X) #bili:崩析 博客园:戳人痛处
此继承的部件类能在实例化的时候设置相关参数,如text,bg 等;
由于部件内有多个地方使用到tkinter变量(tk.StrVar())的地方,于是使用列表包装对象进行传递,可自适应长度;
现完整代码如下:
import tkinter as tk #bili:崩析 博客园:戳人痛处 class Wgt(tk.LabelFrame): def __init__(self,*args,StrVarList:tk.StringVar,**kwargs): super().__init__(*args,**kwargs) self.StrVarList=StrVarList self.Show() def Show(self): for idx in self.StrVarList: tk.Label(self,textvariable=idx).pack(expand=1,fill=tk.X) #bili:崩析 博客园:戳人痛处 bgbg = ['red','green','blue','pink'] def popColor(): popp = bgbg.pop(0) bgbg.append(popp) return popp if __name__=="__main__": win = tk.Tk() win.title('powerd By Bili:崩析') objList = [tk.StringVar() for idx in range(10)] [idy.set("num:{}".format(objList.index(idy))) for idy in objList] xe =Wgt(win,StrVarList=objList,text="2333",bg='red') xe.grid(column=0,row=0,sticky='WNSE') for idx in range(20): for idy in range(3): xe = Wgt(win,StrVarList=objList,text="idx:{},idy:{}".format(idx,idy),bg=popColor()) xe.grid(column=idx,row=idy) win.mainloop()
自定义部件的使用和普通的部件如文本部件没太大使用区别;
运行效果如下;
单个框:
全部: