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

这篇具有很好参考价值的文章主要介绍了Python tkinter bind三种方法传参,不用lambda表达式也可以(任何人都会)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

很多人都有过这样的疑惑:如何在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()

 

 

到了这里,关于Python tkinter bind三种方法传参,不用lambda表达式也可以(任何人都会)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python中lambda表达式的用法

    lambda表达式本身是一个非常基础的python函数语法,其基本功能跟使用def所定义的python函数是一样的,只是lambda表达式基本在一行以内就完整的表达了整个函数的运算逻辑。这里我们简单展示一些lambda表达式的使用示例,以供参考。 首先我们尝试一个最简单的二元求和的ipyth

    2024年04月28日
    浏览(35)
  • 探索Python中的函数式编程:Lambda表达式与函数式工具【第135篇—Lambda表达式】

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在Python编程世界中,函数式编程逐渐成为了一种流行的范式,特别是在处理数据和编写简洁、高效代码时。函数式编程的核心思想是将计算视

    2024年04月08日
    浏览(87)
  • 第六章(7):Python中的函数—lambda表达式

    是一种匿名函数的定义方式,它可以替代函数定义的方式,使代码更加简洁和易读。Lambda表达式的语法形式为:lambda 参数列表: 表达式,其中参数列表和表达式都是可选的,但是在大多数情况下都需要用到它们。Lambda表达式通常被用在需要传递函数对象作为参数的函数中,也

    2024年02月08日
    浏览(54)
  • vue3的兄弟传参(三种方法)

    1.兄弟A先给父元素 父元素再给子组件B (vue2的思路) A组件 父组件 组件B npm install mitt 定义一个bus.js 组件A: 组件B: npm install mitt main.ts 组件A 兄弟B

    2024年02月13日
    浏览(33)
  • Python Lambda表达式的底层原理详解:编译、执行与优化机制

    昨天面试被问到了lambda表达式的底层是怎么实现的,我直接脑子就空白了,因为平时只关注lambda的应用方式 在Python中,无论是普通函数还是Lambda函数,都会经过编译转换成字节码,解释器再执行这些字节码。 1.1 示例代码 通过 dis 模块,可以查看Lambda函数的字节码。这些字节

    2024年04月28日
    浏览(42)
  • 【Python小技巧】通过实例说明推导式,条件表达式和Lambda函数

    按照国际惯例,首先声明:本文只是我自己学习的理解,虽然参考了他人的宝贵见解及成果,但是内容可能存在不准确的地方。如果发现文中错误,希望批评指正,共同进步。 本文总结在Python编程中会使用到的三个(高阶)小技巧:推导式,条件表达式和Lambda函数,并通过实

    2024年03月27日
    浏览(54)
  • JAVA8-lambda表达式8:在设计模式-模板方法中的应用

    JAVA8-lambda表达式1:什么是lambda表达式 JAVA8-lambda表达式2:常用的集合类api JAVA8-lambda表达式3:并行流,提升效率的利器? JAVA8-lambda表达式4:Optional用法 java8-lambda表达式5:toMap引发的线上故障 JAVA8-lambda表达式6:重构和定制收集器 JAVA8-lambda表达式7:重要的函数接口 最近在公司

    2024年02月14日
    浏览(52)
  • Java 8及以上新特性:Lambda表达式、Stream API、Optional类与接口默认方法(四)

    目录 一、接口默认方法 1.1 概念解析: 1.2 应用场景: 1.3 使用注意事项: 1.4 使用示例: 二、结论 1.1 总结Java 8及以上版本四大新特性的重要意义与价值: 1.2 鼓励读者积极学习并运用这些新特性: 1.3 对未来Java版本可能引入的新特性进行展望: 1.1 概念解析: 接口默认方法

    2024年04月13日
    浏览(43)
  • C++基础与深度解析01——函数基本组成+函数传参的三种方法

    请安装Visual Studio 并学习基本的新建项目、新建CPP文件以及运行代码。 函数功能:打印“Hello World” 1.函数构成 输入参数列表+函数名+返回类型+函数主体 如下图所示,但是main函数稍有特殊,其为cpp 现举一个简单函数的例子,z= 2x-3y+3,其中xy均为浮点型小数,取函数名为CalBi

    2024年02月16日
    浏览(49)
  • Tkinter正则表达式工具

    大家好,我是 👉 【Python当打之年(点击跳转)】 本期给大家分享一套简易 Tkinter正则表达式工具 ,希望对你有所帮助,如有疑问或者需要改进的地方可以私信小编。 整体布局: 功能代码介绍: 🏳️‍🌈 8. 几个示例 数字: 字母: 中文: 大写字母: 以上正则字典大家可以

    2024年02月02日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包