如何使用 tkinter 动态创建和销毁小部件?

How to create and destroy widgets dynamically with tkinter?

提问人:Esteban Arcia 提问时间:10/15/2023 最后编辑:Esteban Arcia 更新时间:10/15/2023 访问量:57

问:

我尝试创建最多 5 个输入框,选择组合框中的值,但是一旦我再次尝试构建小部件,我就收到此错误_tkinter。TclError:窗口路径名“.!label3“ 在第 29 行中

import tkinter as tk
from tkinter import ttk

class InputBox:
    def __init__(self, master, row):
        self.label = ttk.Label(master, text=f"Input box {row}:")
        self.label.grid(row=row, column=0)
        self.entry = ttk.Entry(master)
        self.entry.grid(row=row, column=1)

    def destroy(self):
        self.label.destroy()
        self.entry.destroy()

class ComboBox:
    def __init__(self, master):
        self.combo_box = ttk.Combobox(master, values=[1, 2, 3, 4, 5])
        self.combo_box.grid(row=0, column=0)
        self.combo_box.bind("<<ComboboxSelected>>", self.create_input_boxes)
        self.input_boxes = []

    def create_input_boxes(self, event):
        num_boxes = int(self.combo_box.get())
        for i in range(num_boxes):
            if i >= len(self.input_boxes):
                input_box = InputBox(root, i+1)
                self.input_boxes.append(input_box)
            else:
                self.input_boxes[i].label.grid()
                self.input_boxes[i].entry.grid()

        for i in range(num_boxes, len(self.input_boxes)):
            self.input_boxes[i].destroy()

root = tk.Tk()
combo_box = ComboBox(root)

root.mainloop()

我试图让它建造并摧毁要制作的小部件,但一旦被摧毁,它们就无法再次建造。除此之外,我稍后将添加一个按钮来获取输入框中的内容

Python 对象 tkinter

评论

1赞 TheLizzard 10/15/2023
问题是它不会从 中删除小部件,因为它在列表中,所以它会尝试调用已销毁的小部件。self.input_boxes[i].destroy()listself.input_boxes[i].label.grid()

答: 暂无答案