Python - 如何'set' 争论?

Python - How to 'set' an argument?

我正在努力解决这个问题,有人可以帮助我吗? 我的意思是 'set' 一个参数:

from tkinter import *

window = Tk()
I=1
def add():
    global I
    menu1.add_command(label=I, command=lambda:Text(I))
    I=I+1

def Text(I):
    print(I)
menubar = Menu(window)

menu1 = Menu(menubar, tearoff=0)
menu1.add_command(label="Add", command=add)
menu1.add_separator()
menu1.add_command(label="Quit", command=window.quit)
menubar.add_cascade(label="Files", menu=menu1)

window.config(menu=menubar)

window.mainloop()

我想当我们点击添加并在“1”之后打印“1”,当我们添加“2”并点击它时,它打印“2”,但它总是打印 I 的值,如何通过

设置参数
menu1.add_command(label=I, command=lambda:Text(1))

例如? 我不知道我是否清楚,但我不知道如何解释它!

我觉得你的问题是lambda:Text(I)。在本例中,您创建了一个闭包,但该闭包知道 I 是一个全局对象并在稍后对其进行评估。

您可能想立即计算 Text(I) 并将其用作您的结果:

texti = Text(I)   # Immediate evaluation
menu1.add_command(label=I, command=lambda:texti)  # Return prior value of "I"

将您的 Text 函数更改为 closure:

def Text(I):
    def inner():
        print(I)
    return inner

然后将您的 add 函数更改为:

def add():
    global I
    text = Text(I)
    menu1.add_command(label=I, command=text)
    I=I+1

这会将 I 保存在 text 变量中。 text 变量实际上是一个函数,inner,调用时将打印 I

或者如果您想在其他地方使用 Text 函数,您可以使闭包内联:

import functools
...    
menu1.add_command(label=I, command=functools.partial(Text, i))