如何在Button的command中传递参数?

2019年9月9日 / 130次阅读 / Last Modified 2019年9月9日
tkinter

tkinter是Python官方自带的GUI框架,简单好用,其中最常用的恐怕就是Button控件了。这个控件就是在GUI上显示一个按钮,用户点击后,除法command参数所对应的函数。不过,这里有一个很多人都在咨询的问题,如何在Button控件的command中传递参数?

错误的传参写法

下面这段代码,希望实现的功能,是点击clickme按钮后,能够将tstr变量中的字符串在Label中显示出来。

import tkinter as tk

def bn_cmd(str=None):
    if str is not None:
        lb.config(text=str)

root = tk.Tk()
root.geometry('200x100')
lb = tk.Label(root, text='12345')
lb.grid()
tstr = 'I\'m from Button command'
bn = tk.Button(root, text='clickme', command=bn_cmd(tstr))
bn.grid()
root.mainloop()

请看高亮的那一行,Button的command参数,等于bn_cmd(tstr),这种写法是错的!

这种写法,在这段代码载入的时候,bn_cmd函数就被执行了,Label的显示已经被更新,而command这个参数,实际上值为None,因为bn_cmd函数执行没有返回值,在Python中,等同于return None。待这段程序运行起来,点击GUI界面中的clickme按钮,实际上不会有任何效果!!

正确的传参方法

正确的在Button的command中传递参数的方法,是使用lambda匿名函数。代码修改成下面这样,实际上只修改了高亮的那一行:

import tkinter as tk

def bn_cmd(str=None):
    if str is not None:
        lb.config(text=str)

root = tk.Tk()
root.geometry('200x100')
lb = tk.Label(root, text='12345')
lb.grid()
tstr = 'I\'m from Button command'
bn = tk.Button(root, text='clickme', command=lambda:bn_cmd(tstr))
bn.grid()
root.mainloop()

这样的写法,就实现了界面初始显示12345,点击clickme按钮后,变成tstr变量的内容,而tstr变量,是通过参数的方式传递近bn_cmd函数的。

这种写法,command指向一个匿名函数,这个匿名函数就是调用bn_cmd函数,并且制定了tstr这个参数。这种方式就实现了Button控件command中传递参数。

就不截图了,新建一个文件,copy上面这段代码,用python执行,就能看到效果command传参的效果。

-- EOF --

本文链接:https://www.pynote.net/archives/1099

留言区

电子邮件地址不会被公开。 必填项已用*标注


前一篇:
后一篇:

More

麦新杰的Python笔记

Ctrl+D 收藏本页


©Copyright 麦新杰 Since 2019 Python笔记

go to top