【问题标题】:Python - How to 'set' an argument?Python - 如何“设置”一个参数?
【发布时间】:2017-03-26 18:03:31
【问题描述】:

我正在努力解决这个问题,有人可以帮助我吗? 我所说的“设置”一个论点是什么意思:

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))

例如? 不知道我说清楚了不知道怎么解释!

【问题讨论】:

  • 你能举一个更简单的例子吗?对我来说,这个问题并不清楚。
  • 那么,您希望菜单上的每个按钮都记住I 创建时的值吗?
  • 对了,谢谢,我不知道怎么表述!

标签: python python-3.x tkinter menubar


【解决方案1】:

将您的 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))

【讨论】:

  • 您可以使用functools.partial 即时关闭;在这种情况下:menu1.add_command(label=I, command=partial(Text, i))
  • @Jonathan 谢谢!
【解决方案2】:

我认为你的问题是lambda:Text(I)。在这种情况下,您创建了一个闭包,但该闭包知道 I 是一个全局变量,并在稍后对其进行评估。

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

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

【讨论】:

  • 这不起作用;它会立即打印,而不是在他们单击时打印。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-22
  • 2021-06-01
  • 2020-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-17
相关资源
最近更新 更多