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企业版
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的问题。