Python tkinter通过引用的intead值传递整数

Python tkinter通过引用的intead值传递整数,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我已经提供了我可以复制的最小错误代码 我正在使用python 3 我有一个函数printValue,它输出它接收到的参数。我还有一个值列表 使用tkinter,我创建了一个框架,并根据值在框架内生成一个表。当我必须添加一个输出行号的按钮时,问题就出现了。每个按钮在输出相应的行号时输出值5 import tkinter as tk def printValue(param): print(param) Values=[[1],[2],[3],[4],[5]] mainGuiWindow

我已经提供了我可以复制的最小错误代码

我正在使用python 3

我有一个函数printValue,它输出它接收到的参数。我还有一个值列表

使用tkinter,我创建了一个框架,并根据值在框架内生成一个表。当我必须添加一个输出行号的按钮时,问题就出现了。每个按钮在输出相应的行号时输出值5

import tkinter as tk

def printValue(param):
    print(param)

Values=[[1],[2],[3],[4],[5]]
mainGuiWindow = tk.Tk()

frame = tk.Frame(mainGuiWindow)
frame.pack()

def refreshFrame():
    global frame
    global Values
    frame.destroy()
    frame = tk.Frame(mainGuiWindow)
    frame.pack()
    tk.Label(frame,text="Sl. No").grid(row=0,column=0)
    tk.Label(frame,text="Value").grid(row=0,column=1)
    tk.Label(frame,text="Print Entry").grid(row=0,column=2)

    numberOfEntries = 0
    for entry in Values:
        numberOfEntries += 1
        tk.Label(frame,text=numberOfEntries).grid(row=numberOfEntries,column=0)
        tk.Label(frame,text=entry[0]).grid(row=numberOfEntries,column=1)
        tk.Button(frame, text="Print",command=lambda: printValue(numberOfEntries)).grid(row=numberOfEntries,column=2)

refreshFrame()

mainGuiWindow.mainloop() 
问题似乎是button中的函数参数绑定到变量'numberOfEntries'


如何在按钮中传递参数,以便函数打印正确的值?我不想修改函数定义。我需要更改按钮调用它的方式。

这是因为您的帧是如何“刷新”的。在这里定义页面,当设置所有按钮和所有内容时,在呈现所有内容之前,您将遍历整个
for
循环。这将使
命令
成为循环中的最后一个值,
5
。实际上,它将做到这一点:

def(n):
返回n
def列出_函数的_():
x=[]
对于范围(5)中的i:
x、 附加(lambda:f(i))
返回x
对于函数列表()中的func:
func()
4.
4.
4.
4.
4.
这通常是函数的一种行为,因为它取的是您上次定义的
numberOfEntries
的值,而不是您认为定义它时使用的值。要使用等效的“正常”功能来显示这一点:

#注意这里没有参数,因为
#你还没有给你的lambda一个理由
def():
#对值g进行全局查找
返回g
def create_funcs():
funcs=[]
对于范围(5)内的g:
函数附加(f)
返回函数
对于create_funcs()中的func:
func()
4.
4.
4.
4.
4.
这里的解决方法是在定义时物理地将该值绑定到函数。这可以通过
functools.partial
实现。要首先显示简单示例,请执行以下操作:

从functools导入部分
def f(n):
返回n
def列出_函数的_():
x=[]
对于范围(5)中的i:
x、 附加(部分(f,i))
返回x
对于函数列表()中的func:
func()
0
1.
2.
3.
4.
或者,您可以将输入参数添加到lambda并将默认值绑定到它:


def f(n):
返回n
def列出_函数的_():
x=[]
对于范围(5)中的i:
#注意,现在我们已经将输入参数绑定到lambda
x、 附加(λi=i:f(i))
返回x
对于函数列表()中的func:
func()
0
1.
2.
3.
4.
现在,每个调用都会相应地更改。要演示如何在代码中实现此功能,请执行以下操作:

从functools导入部分
def refreshFrame():
全局框架
全球价值
frame.destroy()
frame=tk.frame(MainGUI窗口)
frame.pack()
tk.Label(frame,text=“Sl.No”).grid(行=0,列=0)
tk.Label(frame,text=“Value”).grid(行=0,列=1)
tk.Label(frame,text=“Print Entry”).grid(行=0,列=2)
#我把它改得更地道一点
对于枚举(值,开始=1)中的n,(条目,*ux):
tk.Label(frame,text=n).grid(row=n,column=0)
tk.Label(frame,text=entry).grid(行=n,列=1)
#这个*看起来*像一个lambda,仍然返回一个函数
#但是将'n'的值绑定到函数,而不是依赖
#对已更改的变量的引用
tk.按钮(frame,text=“Print”,command=partial(printValue,n)).grid(行=n,列=2)
@AbhayAravinda Read