Python Tkinter循环生成组件出现list index out of range错误如何解决
报错原因
- 你把
self.entries和self.buttons两个列表的初始化代码放在了for循环内部,每次循环都会清空列表重新创建,这是核心问题。 - 当第一次循环x=0时,列表清空后添加1个元素,下标0可以正常访问;第二次循环x=1时,列表先被清空成空列表,再添加1个元素,此时列表只有下标0的元素,你去访问
self.entries[1]自然就超出索引范围。 - range参数为1的时候只会执行一次循环,不会触发清空后访问高下标的情况,所以能正常运行。
解决方案
- 把两个列表的初始化代码移到for循环外面,只初始化一次,每次循环往同一个列表里追加元素即可。
- 额外优化建议:创建Entry和Button的时候指定父组件为当前Frame实例,避免组件层级混乱,同时记得把Frame实例挂载到父窗口,符合Tkinter组件层级规范。
修正后可运行代码
from tkinter import * class Application(Frame): def __init__(self, master): super().__init__(master) self.master = master # 将当前Frame挂载到父窗口,否则内部组件可能无法正常显示 self.pack() self.submit() def submit(self): # 列表初始化移到循环外,全局只执行一次 self.entries = [] self.buttons = [] for x in range(2): # 指定父组件为当前Frame实例 e = Entry(self) self.entries.append(e) self.entries[x].grid(row=x, column=0) b = Button(self, text='SUBMIT', command=lambda x=x: print(self.entries[x].get())) self.buttons.append(b) self.buttons[x].grid(row=x, column=1) root = Tk() app = Application(root) app.mainloop()
内容的提问来源于stack exchange,提问作者North
相关产品推荐
相关产品推荐

