Python 3的新功能,并在tkinter中编写了我的第一个应用程序。
如果凭证(数字)超出范围(最大和最小),我会创建一个标签,但是如果我先在此范围之外运行,然后更改我的数字,我想在我的开头删除标签其他代码。
我尝试使用Label.delete
,Label.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")
感谢您的帮助。
//弗雷德
答案 0 :(得分:1)
由于未将任何对象分配给这些标签,因此引发错误。如果他们没有参考,python将如何知道需要销毁哪个Label。
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")
答案 1 :(得分:0)
您创建了标签,但没有给每个标签提供参考/标签名称。没有参考,您将无法告诉程序要删除哪个标签。
代替使用:
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)
因此将其设置为none,因为.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语句,以便只运行标签1的Label1.destroy()代码存在。这样,如果从未创建标签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)