Python-解决Tkinter按钮类似组件Command的传参问题

之前在网上看到过许多关于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等其他可挂载函数的组件也如此操作

也能得到相应的结果!

希望大家多多支持讨论,之后会继续更新!

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值