很多人都有过这样的疑惑:如何在tkinter 里面传参?比如创建了一个列表,需要对列表中的每一项绑定方法;比如有多个相似的按钮想要一次性完成,这个时候不得不传递参数。
但是Python 语言又非常讨厌的没有给传递参数的空间,bind 方法只能传函数,而不能传参数是真的讨厌(如果你是自己用,你也可以直接去改原码的,但谁会这么干呢),于是乎就产生了一大堆文章来解决bind 传参。
然而,所有我看见的全都无一例外的用lambda 表达式,或许这种开销最少,速度最快,但是同时引发了一个非常头疼的问题:我看不懂啊。
于是乎每次要传参就会去网上搜索(面向csdn 编程),然后一知半解写下来,下一次又忘掉。不用笑话我,我就是个Python 新手,很多初学Python 的人必定也有这种体会。
所以我又想出了新的解决方法(对于前两种会的可以直接跳转阅读)
目录
方法一:使用lambda表达式
方法二:使用class类
方法三:闭包与装饰器(新,任何人都会)
一个实例:
文章来源地址https://www.toymoban.com/news/detail-483588.html
方法一:使用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()
文章来源:https://www.toymoban.com/news/detail-483588.html
到了这里,关于Python tkinter bind三种方法传参,不用lambda表达式也可以(任何人都会)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!