Python tkinter bind三种方法传参,不用lambda表达式也可以(任何人都会)

很多人都有过这样的疑惑:如何在tkinter 里面传参?比如创建了一个列表,需要对列表中的每一项绑定方法;比如有多个相似的按钮想要一次性完成,这个时候不得不传递参数。

但是Python 语言又非常讨厌的没有给传递参数的空间,bind 方法只能传函数,而不能传参数是真的讨厌(如果你是自己用,你也可以直接去改原码的,但谁会这么干呢),于是乎就产生了一大堆文章来解决bind 传参。

然而,所有我看见的全都无一例外的用lambda 表达式,或许这种开销最少,速度最快,但是同时引发了一个非常头疼的问题:我看不懂啊。

于是乎每次要传参就会去网上搜索(面向csdn 编程),然后一知半解写下来,下一次又忘掉。不用笑话我,我就是个Python 新手,很多初学Python 的人必定也有这种体会。

所以我又想出了新的解决方法(对于前两种会的可以直接跳转阅读)

目录

方法一:使用lambda表达式

方法二:使用class类

方法三:闭包与装饰器(新,任何人都会)

一个实例:


方法一:使用lambda表达式

这是原方法(抱歉不小心多打了一个星号,毕竟这个也是我刚刚查的)

def 函数名称(event,需要的参数):
    # 函数内容

def 函数中介(func,***kwds):
    # kwd是需要的参数
    return lambda event,func=func,kwds=kwds: func(**kwds)

相信不少人也是一脸懵:lambda 是啥啊?我怎么没见到过?

其实作者也不太会用lambda,于是作者又翻阅半天资料,消耗的时间可是远大于编程时间了。甚至这段代码都是刚刚从csdn 上扒下来的一篇

而且,这个表达式也不好阅读,等到下一次又要传参的时候,不少人可能又是一脸懵:我上次怎么做的来着?

那么,我们试一试不传参如何呢?

方法二:使用class类

我们都知道,一个类中,凡是带有self. 的变量,都可以在类中的函数中调用。

所以,我们有了第二种解决方法:

class main:
    def __init__(self):
        # 程序主体
        self.name = "小明"
        self.age = 10
        

    def 函数名称(self,event):
        # 函数内容
        print(self.name)
        print(self.age)

        # 以及一个相当迷惑人的地方,注意这里的window才是主要
        self.window.title()

这种方法优点是好了,你不需要再额外设置方法来实现了,但是也出现了一个问题:

调用的变量是实时改变的,而不是固定的。

比如说,有可能你在一个输入框改变了self.age,结果按钮的内容也发生了变化(不过这种变化大多是需要的),可能你的某个变量加到100,而当你点击57按钮是,会打印100,这种变化是不希望出现的。

一般来说,对于这种方法,都有一个解码的过程。就是将按钮的某些信息放到一个变量中,然后从变量提取出关键内容来。

比如你有个列表存放的是水果信息,当你按一下“苹果”时,将会有个变量,专门存储苹果这两个字,然后再打印信息“你吃了一个苹果”。

这种方法实际上是不适合作为传参的方法的,相反更适合做一个类似血条经验值之类随时会变动的方法。

除了class 类,还有global 关键字也是同样的道理(这时又出现了一个问题:global放在哪个方法里面?)。好吧,这个方法对于新学python的人来说好像不是那么的友好。

方法三:闭包与装饰器(新,任何人都会)

好吧,一些人一看到“闭包”二字就蒙了:闭包是什么东东?

似乎装饰器也是一个很难懂的东西?不要着急,这里只是一个解决方法,绝对不会像课本那样讲的那么深。

先看例句:

def 函数名称(需要的参数):

    def func(event):

        # 函数内容,可以直接调用参数

    return func # 返回函数

这么看来好像很简单的样子,但是我找遍了网站,也没有发现有人提(也有可能是搜索引擎的锅),于是乎勉为其难的提一下。

闭包就是“一种特殊的函数,由两个函数的嵌套组成,且称之为外函数和内函数,外函数返回值是内函数的引用。”

简单来说就是这样:

def 外函数(外参数):
    def 内函数(内参数): # 允许没有参数
        # 这是函数语句
    return 内函数

引用 = 外函数(外参数)
引用(内参数)

一般来讲,外参数都是存在的,要不然就跟直接定义一个内函数,没什么区别。

内函数的语句可以直接使用内外两个函数的参数,外函数的参数可以在外函数的语句中处理掉。

比如输入了一串身份证号,可以先在外函数中把它分解为省份、生日、性别,这样内函数工作时就不会再把它分解第二遍了,这种方法适用于内函数要多次使用时的做法。

这么一看那函数不就是天然的代替lambda 表达式的方法吗,只不过一个是匿名函数,另一个却给内函数起了个名字。

优点:

  • 短(雾)。这里指的是绑定方法的时候方便,直接一个函数,一个括号放上内容就可以
  • 易懂。这是对于程序员新手来说的,对于不怎么常用的关键词来说,少写一点还是好一点的。

缺点:

  • 开销大。毕竟一个是匿名函数,使用的是关键字,而另一个却使用函数的嵌套,对于一些大型工程可能无法胜任,但是对于日常用的那些小程序还是非常友好的。

当然,我们也可以写成一个装饰器(不会的去查查吧,我也算为别人贡献阅读量了),这样就可以一次完成多个函数的闭包了。

一个实例:

 (很久以前写的,原谅我命名不规范)

import tkinter
import shutil
import os

ck=tkinter.Tk()
ck.title('新建')
word = tkinter.Button(ck,text='新建word文档')
ppt = tkinter.Button(ck,text='新建ppt文档')
excel = tkinter.Button(ck,text='新建excel文档')
wenben = tkinter.Entry(ck)
tishi = tkinter.Label(ck,text='或者重命名:',height=1)
shuiyin = tkinter.Label(ck,text='Make By Yourouchour  v1.2')

def open_WPS_help(houzhui,biaoti):# 注意这里
    def open_WPS(e):
        panduan = True
        shuzi = 1
        file = r"C:\Program Files\Open WPS\1"+houzhui
        neirong = wenben.get()
        if neirong == '':
            neirong = biaoti
        while panduan:
            if shuzi == 1:
                wenzi = neirong + houzhui
            else:
                wenzi = neirong + f'({shuzi})' + houzhui
            panduan = os.path.exists(wenzi)
            shuzi += 1
        wenzi = r'C:/Users/Administrator/Desktop/' + wenzi
        shutil.copyfile(file,wenzi)
        os.startfile(wenzi)
        ck.quit()
    return open_WPS
    
word.grid(row=0,column=1)
ppt.grid(row=0,column=2)
excel.grid(row=0,column=3)
tishi.grid(row=1,column=1)
wenben.grid(row=1,column=2,columnspan=2)
shuiyin.grid(row=2,column=1,columnspan=3)

word.bind('<Button-1>',open_WPS_help('.docx','新建DOCX文档'))
ppt.bind('<Button-1>',open_WPS_help('.pptx','新建PPTX文档'))
excel.bind('<Button-1>',open_WPS_help('.xlsx','新建XLSX文档'))

tkinter.mainloop()

猜你喜欢

转载自blog.csdn.net/2301_77245958/article/details/129770324