繁体   English   中英

如何将参数传递给作为关键字参数传递的函数?

[英]How do you pass parameters to a function passed as a keyword argument?

我有一个tkinter按钮,谁的命令调用一个带有参数的函数,在这种情况下,该函数将tkinter窗口作为参数。

from tkinter import *

def main():
    root = Tk()
    app = Application(master=root)
    app.update()

def do_something(tk_win):
    # Do something to the window

class Application(Frame):
    master = None

    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.create_widgets()

    def create_widgets(self):
        self.frame = Frame(self.master)
        self.btn = Button(self, text="Redo Search", command=do_something, self)
        self.frame.pack()
        self.search_again.pack()

我为btn赋值的行被我的IDE标记为“在关键字参数后面有位置参数”。 我明白为什么这么说,但是我不知道如何将self作为参数传递给函数。 我该怎么做呢? 谢谢!

要在调用第二个self作为参数传递给do_something时,您可以创建一个零参数函数,该函数在调用时依次调用do_something和所需的单个参数。

一种方法是使用lambda

self.btn = Button(self, text="Redo Search", command=lambda: do_something(self))

...另外一种方法是使用functools.partial帮助器 (在functools模块中)来生成“部分评估”函数,其目的是:

self.btn = Button(self, text="Redo Search", command=functools.partial(do_something, self))

简单,从函数中删除自我

self.btn = Button(self, text="Redo Search", command=lambda: do_something(self))

以下更改对您的设计有用吗? 使函数成为类的一部分,并使用“ self-dot”语法将其“正常”调用。

class Application(Frame):
    master = None

    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.create_widgets()

    ### Pull the function into the class
    def do_something(self):
        # Do something to the window
        ...

    def create_widgets(self):
        self.frame = Frame(self.master)
        ### Call the function with straightforward syntax
        self.btn = Button(self, text="Redo Search", command=self.do_something)
        self.frame.pack()
        self.search_again.pack()

通过使用do_something(self)函数。

返回一个新的部分对象,该对象在被调用时的行为类似于使用位置参数args和关键字arguments关键字调用的func。 如果将更多参数提供给调用,则将它们附加到args。 如果提供了其他关键字参数,它们将扩展并覆盖关键字。 大致相当于:

def部分(func,args,* keywords):def newfunc(* fargs,** fkeywords):newkeywords = keyword.copy()newkeywords.update(fkeywords)return func(* args,fargs,* newkeywords)newfunc.func = func newfunc.args = args newfunc.keywords =关键字返回newfunc

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM