python tkinter 向command中传递参数

参考:https://stackoverflow.com/questions/6920302/how-to-pass-arguments-to-a-button-command-in-tkinter

背景说明


tkinter 组件中经常会绑定一些事件,实现的方向是添加command关键字,后面跟一个实现的函数方法,如:command = func()。但有时你还需要向 func 函数传递必要的参数,我们常见的想法是这样:

button = tk.Button(root, text="Show me", command=action(args))

遗憾的是这样却不能实现你想要的结果。那如何才能实现传递参数呢?下面介绍两种简单的方法。

方法一、使用 partial 函数


代码示例:

from functools import partial
button = tk.Button(root,  text="Show me", command=partial(func, arg1, arg2,...))

我们可以通过使用 functools 模块中的 partial 对象来传递参数。

用例子来说明,下面是给菜单添加item并绑定事件:

colors = ['黄色','亮紫','紫灰','亮蓝','深绿','鲜红','洋红','灰色']
for c in colors:
    zrlbMenu.add_command(label=c, command=partial(mark_zrlb,c))

就会根据变量c,生成多项item执行事件。这里主要起作用的是 partial 函数,它是一个偏函数


partial 函数的语法如下:

functools.partial(func, *args, **keywords)

偏函数:是在已有的函数基础上生成一个新的函数,这新函数的功能和已有函数相同,但是,这个新函数的部分参数已被偏函数确定。简单来说,偏函数适合当函数中的某些参数值在某些场景下是定值的时候,将其简化。什么意思呢?就是省略某些不变的参数,使得代码会更加简洁

例如,要在 menu 目录下新建若干文件夹,原代码:

import os
from os import mkdir

mkdir(os.path.join('./menu', 'dir1' ))
mkdir(os.path.join('./menu', 'dir2' ))
mkdir(os.path.join('./menu', 'dir3' ))

使用 partial 修改之后,代码如下:

import os
from os import mkdir
from functools import partial

menu_join = partial(os.path.join, './menu')

mkdir(menu_join('dir1'))
mkdir(menu_join('dir2'))
mkdir(menu_join('dir3'))

menu_join 是通过偏函数 partial() 创建的一个新的函数,而不是赋值变量。menu_join 这个函数在执行时,先调用 os.path.join 并将 './dest' 作为参数传给 os.path.join,然后再传入 "dir"

来看一下 partial介绍1介绍2

  1. 它是用于创建一个类似原函数但有固定参数的偏函数,从字可以看出,它是一个辅助函数。
  2. 它一共有三个部分:
    1). 第一个部,即第一个参数一个函数,这个函数可以是你定义的,也可以是 python 内置函数
    2). 第二部分,是一个可变参数,*args
    3). 第三部分,是一个关键字参数
  3. 它的作用是:将所作用的函数作为 partial() 函数的第一个参数,原函数的各个参数依次作为 partial() 函数的后续参数,原函数有关键字参数的一定要带上关键字,没有的话,按原有参数顺序进行补充。

总结来说:当函数的参数个数太多,需要简化时,使用 functools.partial 可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。

方法二、使用 lambda 函数


代码示例:

button = tk.Button(root, text="Show me", command=lambda:func(param))

我们可能通过 python 中的 lambda 函数来创建一个临时的、一次性的简单函数用来实现传递参数。但是注意,这里有一个小小的细节,lambda 函数只会在调用时执行内部语句。也就是说,如果你传递的参数是一个变量,并且这个变量值是随着条件变化的,使用它来实现时,调用时就会传入这个变量最后的值,可能就不是你预期想要传入的值。

还是上面那个菜单的例子:

colors = ['黄色','亮紫','紫灰','亮蓝','深绿','鲜红','洋红','灰色']
for c in colors:
    zrlbMenu.add_command(label=c, command=lambda:mark_zrlb(c))

变量c是变化的,但实际的效果表现出来是,c 取的值永远是最后一个值'灰色'
所以,lambda 这一方法是应用于参数是固定的变量。例如:

btnLable= tk.Button(root, text="0")
def change_number(num):
    counter = int(str(btnLable['text']))
    counter += num
    btnLable.config(text=str(counter))
    
button = tk.Button(root, text="Increase", command=lambda: change_number(5))

lambda 函数的语法如下:

lambda: argument_list: expression

常见的 lambda 函数示例:

lambda x, y: x*y            # 函数输入是x和y,输出是它们的积x*y
lambda:None                 # 函数没有输入参数,输出是None
lambda *args: sum(args)     # 输入是任意个数参数,输出是它们的和(隐性要求输入参数必须能进行算术运算)
lambda **kwargs: 1          # 输入是任意键值对参数,输出是1
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • 高阶函数:将函数作为参数 sortted()它还可以接收一个key函数来实现自定义的排序,reversec参数可反...
    royal_47a2阅读 677评论 0 0
  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 2,729评论 0 8
  • 第一部分 Python基础篇(80题) 1、为什么学习Python? Python相对于其他编程语言有很多优点: ...
    清清子衿木子水心阅读 1,697评论 0 1
  • 来源:https://www.cnblogs.com/aland-1415/p/6849193.html[http...
    顺子_aba3阅读 378评论 0 0
  • python基础 1.字符串和编码对于单个字符的编码,Python提供了ord()函数获取字符的整数表示,chr(...
    jxxh阅读 499评论 0 0