如何在tkinter GUI窗口中多次放置相同文本标签生成多行控件
问题原因
Tkinter 中每个控件实例都是唯一的,对同一个实例多次调用 grid() 方法只会修改控件的摆放位置,不会生成新的控件。你现在的代码在初始化Row类时就已经创建了3个Label实例,后续三次调用add()只是把这三个Label反复移动位置,最后停在第三行,所以窗口里只能看到一行控件。
解决方案
不要提前创建固定的控件实例,改为在Row类中存储控件的创建模板(控件类型、配置参数),每次调用add()方法时根据模板全新生成对应的控件实例,就能实现多次新增相同样式的行,不需要手动重复写创建代码。
修改后可运行代码
import tkinter as tk class Row: def __init__(self, name, widget_templates): # widget_templates格式:[(控件类, 参数字典), ...] self.name = name self.widget_templates = widget_templates def add(self, previous_row_no, column_start_no, widget_rows, parent): row_no = previous_row_no + 1 column_no = column_start_no widgs = [] # 每次add都根据模板新建控件 for widget_cls, widget_config in self.widget_templates: new_widget = widget_cls(parent, **widget_config) new_widget.grid(column=column_no, row=row_no) column_no += 1 widgs.append(new_widget) widget_rows.append(widgs) return row_no, widget_rows root = tk.Tk() root.geometry('200x200') widgrows = [] # 存储控件模板,不是提前创建实例 row_templates = [ (tk.Label, {"text": "Label 1"}), (tk.Label, {"text": "Label 2"}), (tk.Label, {"text": "Label 3"}), ] row1 = Row('row1', row_templates) # 新增3行控件,每次生成的都是全新的实例 row1.add(0, 0, widgrows, root) row1.add(1, 0, widgrows, root) row1.add(2, 0, widgrows, root) root.mainloop()
上述代码运行后即可实现预期的3行控件效果,后续如果要实现点击ADD按钮新增行的逻辑,直接在按钮回调函数中调用add()方法即可,不需要重复编写控件创建代码。
内容的提问来源于stack exchange,提问作者dasheet
相关产品推荐
相关产品推荐

