[记]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()
    

自定义部件的使用和普通的部件如文本部件没太大使用区别;

运行效果如下;

单个框:

全部: