【问题标题】:Remove Label in Else在 Else 中删除标签
【发布时间】:2019-04-18 17:03:08
【问题描述】:

Python 3 非常新,我在 tkinter 中编写了我的第一个应用程序。

当凭证(编号)超出范围、最大值和最小值时,我有一个 if 创建标签,但是如果我首先在范围之外运行然后更改我的编号,我想在我的开头删除标签其他代码。

我尝试过使用Label.deleteLabel.destroy,但只会抛出错误。

if int(voucher.get()) > int(maxN):
    textbox.configure(state="normal")
    textbox.delete('1.0', END)
    textbox.update()
    Label(root, text="The voucher " + str(voucher.get()) + " number is outside of valid range").place(x=200, y=175)
    textbox.configure(state="disabled")

elif int(voucher.get()) < int(minN):
    textbox.configure(state="normal")
    textbox.delete('1.0', END)
    textbox.update()
    Label(root, text="The voucher " + str(voucher.get()) + " number is outside of valid range").place(x=200, y=175)
    textbox.configure(state="disabled")

else:
    # I want to destroy Label here
    textbox.configure(state="normal")
    Label(root, text="All well")

感谢任何帮助。

//弗雷德

【问题讨论】:

    标签: tkinter label python-3.7


    【解决方案1】:

    它会引发错误,因为您没有将任何对象分配给这些标签。如果他们没有引用,python 将如何知道需要销毁哪个标签。

    destroy()Label 类的一个方法,如果还没有为类 Label 创建对象,则不能仅通过 Label.destroy() 调用。

    例如:

    L = Label(root, text="Hello World")
    L.pack()
    
    # Now, we can destroy it by
    
    L.destroy()
    

    现在您的代码,因为我不知道您要删除哪个标签,所以将采用您可以根据您的要求更改的第一个标签。

    if int(voucher.get()) > int(maxN):
        textbox.configure(state="normal")
        textbox.delete('1.0', END)
        textbox.update()
        L1 = Label(root, text="The voucher " + str(voucher.get()) + " number is outside of valid range")
        L1.place(x=200, y=175)
        textbox.configure(state="disabled")
    
    elif int(voucher.get()) < int(minN):
        textbox.configure(state="normal")
        textbox.delete('1.0', END)
        textbox.update()
        L2 = Label(root, text="The voucher " + str(voucher.get()) + " number is outside of valid range")
        L2.place(x=200, y=175)
        textbox.configure(state="disabled")
    
    else:
        L1.destroy()      # Label in if will destroy
        L2.destroy()      # Label in elif will destroy
        textbox.configure(state="normal")
        L3 = Label(root, text="All well")
    

    【讨论】:

      【解决方案2】:

      您创建了标签,但没有为每个标签指定参考/标签名称。如果没有引用,您无法告诉程序要删除哪个标签。

      而不是使用:

      Label(root, text="The voucher " + str(voucher.get()) + " number is outside of valid range").place(x=200, y=175)
      

      您必须使用(例如带有标签 Label1:):

      Label1 = Label(root, text="The voucher " + str(voucher.get()) + " number is outside of valid range")
      Label1.place(x=200, y=175)
      

      这将创建一个引用/标签名称为“Label1”的标签 注意:我将 .place() 放在下面的行中,因为当您将 .place() 放在同一行时,如下所示:

      Label1 = Label(root, text="The voucher " + str(voucher.get()) + " number is outside of valid range").place(x=200, y=175)
      

      引用/标签 Label1 设置为返回的内容:

      Label(root, text="The voucher " + str(voucher.get()) + " number is outside of   valid range").place(x=200, y=175)
      

      所以它被设置为无,因为 .place() 返回无。

      要销毁标签(例如 Label1),请使用 Label1.destroy()。

      您的改进代码:


      if int(voucher.get()) > int(maxN):
          textbox.configure(state="normal")
          textbox.delete('1.0', END)
          textbox.update()
          Label1 = Label(root, text="The voucher " + str(voucher.get()) + " number is outside of valid range")
          Label1.place(x=200, y=175)
          textbox.configure(state="disabled")
      
      elif int(voucher.get()) < int(minN):
          textbox.configure(state="normal")
          textbox.delete('1.0', END)
          textbox.update()
          Label1 = Label(root, text="The voucher " + str(voucher.get()) + " number is outside of valid range")
          Label1.place(x=200, y=175)
          textbox.configure(state="disabled")
      
      else:
          Label1.destroy()
          textbox.configure(state="normal")
          Label2 = Label(root, text="All well")
          Label2.place(x=200, y=175)
      

      我建议你添加:

      if Label1.winfo_exists():
          Label1.destroy()
      

      到您的 else 语句,以便 Label1.destroy() 代码仅运行标签 1 存在。这样,如果从未创建过标签 1,则程序不会尝试销毁它。

      这将使你的 else 语句看起来像这样:

      else:
          if Label1.winfo_exists():
              Label1.destroy()
          textbox.configure(state="normal")
          Label2 = Label(root, text="All well")
          Label2.place(x=200, y=175)
      

      【讨论】:

      • 非常感谢两位的帮助,问题解决了,还得加上:global label5 using: if label5.winfo_exists(): label5.destroy() 很有用。 //弗雷德
      猜你喜欢
      • 2014-09-06
      • 1970-01-01
      • 2019-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多