之前在网上看到过许多关于Tkinter中Button挂载Command命令函数,无法传参的问题,一般解决办法是用lambda构造函数进行传参,但想了想这样有许多不便,还有一些限制性,于是鼓捣了一阵子......
首先来一个大致讲解
最终,目前是通过给Button类组件创建类(Class),类中包含Use方法去调用需传参的命令函数,而通过Tkinter创建Button时,command挂载self.use函数,传入参数作为属性保存在类中(self.parm),来实现套娃式传参。代码如下图:
class button():
def Use(self):
if not self.command:
pass
else:
self.result=self.command(self.parm)
def __init__(self, father, text, font, fontsize, anchor, justify, state, image, bitmap, bg, fg, bd, relief, size, pos, cursor, command, parm):
self.father = father
self.__layer = None
self.text = text
self.font = font
self.fontsize = fontsize
self.anchor = anchor
self.justify = justify
self.state = state
self.image = image
self.bitmap = bitmap
self.bg = bg
self.fg = fg
self.bd = bd
self.relief = relief
self.size = size
self.pos = pos
self.cursor=cursor
self.parm=parm
self.command=command
self.result=None
self.proj = Button(self.father.proj,text=self.text,font=(self.font, self.fontsize),anchor=self.anchor,justify=self.justify,state=self.state,
image=self.image,bitmap=self.bitmap,width=self.size[0],height=self.size[1],bg=self.bg,fg=self.fg,bd=self.bd,
cursor=self.cursor,relief=self.relief,command=self.Use)
如上图所示,关键部分已经用红线划出:
self.proj 存放 tk类Button组件 (创建时,command=self.use,而不是直接赋值实际作用函数)
self.command 存放 实际的作用函数
self.parm 存放 传入参数
当我们点击按钮时,通过原生Button类 先调用 command=self.use
于self.use中,可以看到
在此先判断command是否传入,有的话便执行,在Use函数中实现了传参执行
(有需要这里还可以加一个return self.result,直接返回执行结果)
接下来就是参数 parm 的问题
一开始想是有几个办法
1、传参以列表形式传入
但有诸多不足,比如我们给parm指定了一个输入类型是列表,首先用户传入单个数据需要包一层
[ ] 十分多余,其次,传入之后,在实际函数中需要根据 parm[index]进行取值操作,不方便记忆,可读性差,因此我pass掉了
2、传参以结构体(类)形式传入
目前选择的正是这种方式,因此我也创建了函数,用于创建传参结构体。如下
def Pvar():
'''
用于创建P框架 函数变量,用于解除TK原本无法传参的限制
:return:返回结构体r,包含你所需的变量以 r.变量名 进行赋值声明
传参时只需填写结构体r即可
'''
class var():
def __init__(self):
self.type = 'FactoryVar'
r=var()
return r
实际上就行创建了个类,不过弄个函数还是有好处的,区分出来还是挺好
如我需要为parm创建一个新的结构体:
var = Pvar() 即可
然后添加需要的变量名称
var.a = 1
var.b = 2
......
我创建了一个函数用于生成这样的button类(部分截图):
之后使用以下函数进行创建Button,并挂载函数
var=Pvar()
var.a=0
var.c=3
def ADD(v):
v.a+=v.c
v.c+=v.a
r=v.a+v.c
print(v.a,v.c,r)
win = Pwindow()
Badd = Pbutton(win,text='add',command=ADD,parm=var)
Badd.proj.place(x=0,y=0)
win.mainloop()
以下是执行界面及结果:
展望类推
以此类推,将Menu、Checkbutton等其他可挂载函数的组件也如此操作
也能得到相应的结果!
希望大家多多支持讨论,之后会继续更新!