簡體   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