[英]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.