繁体   English   中英

删除在循环中创建的条目小部件

[英]Remove Entry widgets created in a loop

所以我现在正在使用 tkinter 制作一个 GUI 应用程序,无论我在最上面的框中输入什么数字,GUI 都会自动添加另一个条目行

当我输入 1,然后我尝试输入更大的数字(例如 3 或 5)时,它工作得很好,输入行会显示出来,问题是每当我输入数字(例如 5)并尝试输入小于 5 的数字时,条目仍会显示而不是删除

有什么办法可以让我输入较大的数字(例如 4),然后输入较小的数字(例如 2 和 the),则 5 中的条目将被删除?

编辑:添加代码

def choiceone(self):
    self.labeln1 = ttk.Label(self, text="1", justify="center")
    self.labeln1.grid(row=7, column=1)

    self.entry1 = ttk.Entry(self, width=15)
    self.entry1.grid(row=7, column=2)

    self.entry2 = ttk.Entry(self, width=15)
    self.entry2.grid(row=7, column=3)

    self.entry3 = ttk.Entry(self, width=15)
    self.entry3.grid(row=7, column=4)

    self.entry4 = ttk.Entry(self, width=15)
    self.entry4.grid(row=7, column=5)


def choicetwo(self):
    self.labeln2 = ttk.Label(self, text="2", justify="center")
    self.labeln2.grid(row=9, column=1)

    self.entry5 = ttk.Entry(self, width=15)
    self.entry5.grid(row=9, column=2)

    self.entry6 = ttk.Entry(self, width=15)
    self.entry6.grid(row=9, column=3)

    self.entry7 = ttk.Entry(self, width=15)
    self.entry7.grid(row=9, column=4)

    self.entry8 = ttk.Entry(self, width=15)
    self.entry8.grid(row=9, column=5)


def choicethree(self):
    self.labeln3 = ttk.Label(self, text="3", justify="center")
    self.labeln3.grid(row=11, column=1)

    self.entry9 = ttk.Entry(self, width=15)
    self.entry9.grid(row=11, column=2)

    self.entry10 = ttk.Entry(self, width=15)
    self.entry10.grid(row=11, column=3)

    self.entry11 = ttk.Entry(self, width=15)
    self.entry11.grid(row=11, column=4)

    self.entry12 = ttk.Entry(self, width=15)
    self.entry12.grid(row=11, column=5)


class MultiLevel(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = ttk.Label(self, text="Fatigue Failure", font=LARGE_FONT)
        label.grid(columnspan=3, sticky="w")

        labele1 = ttk.Label(self, text="METHOD 1", font=LARGE_FONT)
        labele1.grid(row=1, column=1)

        ttk.Separator(self, orient=tk.HORIZONTAL).grid(row=2, columnspan=5,   sticky="EW")

        labele0 = ttk.Label(self, text="")
        labele0.grid(row=3, column=1)

        label0 = ttk.Label(self, text="Number of \nStress Level: ", font=MEDIUM_FONT, justify="center")
        label0.grid(row=4, column=1)
        self.entry0 = ttk.Entry(self, width=15)
        self.entry0.grid(row=4, column=2)

        button0 = ttk.Button(self, text="OK ", command=lambda: self.ok())
        button0.grid(row=4, column=3)

    def ok(self):
        try:
            float(self.entry0.get())

        except ValueError:
            errormsg("INPUT YOUR NUMBER")

        else:
            if float(self.entry0.get()) == 1:
            choiceone(self)

        elif float(self.entry0.get()) == 2:
            choiceone(self)
            choicetwo(self)

        elif float(self.entry0.get()) == 3:
            choiceone(self)
            choicetwo(self)
            choicethree(self)

每次你输入 numer 时,你总是在网格中创建新条目,但你永远不会删除以前的条目,所以不要指望它们会神奇地消失。

您必须使用grid_forget()隐藏小部件(但不能从内存中删除),或使用grid_remove()从网格和内存中删除。

现在,当您输入 1 时,您将在第一行中创建条目,而当您输入 3 时,您将再次在第一行中创建条目,因此您在第一行的每个单元格中都有两个条目 - 一个在另一个上方 - 以前的条目不会消失。

顺便说一句:如果您将条目保留在列表中会更容易 - self.entries[0]self.entries[1]等,或者作为二维列表self.entries[row][col]

正如@furas 所说,您需要先销毁现有的小部件:

def ok(self):
    try:
        float(self.entry0.get())

    except ValueError:
        errormsg("INPUT YOUR NUMBER")

    else:
        # remove existing widgets start from row 7
        for widget in self.grid_slaves():
            if int(widget.grid_info()["row"]) >= 7:
                widget.destroy()

        if float(self.entry0.get()) == 1:
            choiceone(self)
        ...

PS:根据您的代码,关注小部件位于第 7 行及以上。

该建议基于您的代码,但我认为您最好重构您的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM