Python Tkinter错误:同一行上的按钮合并

Python Tkinter错误:同一行上的按钮合并,python,tkinter,Python,Tkinter,我有tkinter\u sandbox.py: 从tkinter导入* 从tkinter导入ttk root=Tk() root.title(“Tkinter bug?”) 大型机=ttk.Frame(根) mainframe.grid(列=0,行=0) 按钮=[] 对于范围(3)中的i: buttons.append(ttk.Button(大型机,text=“1”,command=lambda:print(i))) 按钮[i]。网格(行=1,列=i+1) root.mainloop() 然后

我有
tkinter\u sandbox.py

从tkinter导入*
从tkinter导入ttk
root=Tk()
root.title(“Tkinter bug?”)
大型机=ttk.Frame(根)
mainframe.grid(列=0,行=0)
按钮=[]
对于范围(3)中的i:
buttons.append(ttk.Button(大型机,text=“1”,command=lambda:print(i)))
按钮[i]。网格(行=1,列=i+1)
root.mainloop()
然后,我使用cmd上的
pythonttkinter\u sandbox.py
执行代码。弹出一个窗口,我从左到右点击按钮一次

控制台上的输出为
2 2
,而预期为
0 1 2

规格:

  • Python 3.5.1
  • Tkinter版本8.6
  • Windows7企业版

问题在于需要通过lamba声明传递参数:

command=lambda:print(i)
需要:

command=lambda i=i:print(i)
所以完整的代码:

from tkinter import *
from tkinter import ttk
root = Tk()
root.title("Tkinter bug?")
mainframe = ttk.Frame(root)
mainframe.grid(column=0, row=0)
buttons = []

for i in range(3):
    buttons.append(ttk.Button(mainframe, text="1", command=lambda i=i:print(i)))
    buttons[i].grid(row=1, column=i+1)

root.mainloop()

问题是您需要通过lamba声明传递参数:

command=lambda:print(i)
需要:

command=lambda i=i:print(i)
所以完整的代码:

from tkinter import *
from tkinter import ttk
root = Tk()
root.title("Tkinter bug?")
mainframe = ttk.Frame(root)
mainframe.grid(column=0, row=0)
buttons = []

for i in range(3):
    buttons.append(ttk.Button(mainframe, text="1", command=lambda i=i:print(i)))
    buttons[i].grid(row=1, column=i+1)

root.mainloop()

您正在使用
i
创建按钮,并通过正在执行的命令将其更新为新值

固定代码:

from tkinter import *
from tkinter import ttk
root = Tk()
root.title("Tkinter bug?")
mainframe = ttk.Frame(root)
mainframe.grid(column=0, row=0)
buttons = []

for i in range(3):
    buttons.append(ttk.Button(mainframe, text="1", command=lambda x=i:print(x)))
    buttons[i].grid(row=1, column=i+1)

root.mainloop()

您正在使用
i
创建按钮,并通过正在执行的命令将其更新为新值

固定代码:

from tkinter import *
from tkinter import ttk
root = Tk()
root.title("Tkinter bug?")
mainframe = ttk.Frame(root)
mainframe.grid(column=0, row=0)
buttons = []

for i in range(3):
    buttons.append(ttk.Button(mainframe, text="1", command=lambda x=i:print(x)))
    buttons[i].grid(row=1, column=i+1)

root.mainloop()

我觉得否决票和重复票的标记无理地不屑一顾。OP可能没有意识到循环内的lambda函数是问题的原因。(事实上,我认为他怀疑这是Tkinter中的一个bug。)我认为更合适的回答是指出lambda的问题。我发现否决票和重复标记无理地不屑一顾。OP可能没有意识到循环内的lambda函数是问题的原因。(事实上,我认为他怀疑这是Tkinter中的一个bug。)我认为更合适的回答是指出lambda的问题。