Python Tkinter在添加标签之前删除标签

Python Tkinter在添加标签之前删除标签,python,tkinter,Python,Tkinter,我已经用Python创建了一个简单的DNS解析器应用程序 #!/usr/bin/env python import dns.resolver import socket from Tkinter import * import Tkinter import tkMessageBox # GUI root = Tkinter.Tk() root.geometry("1200x300") root.title("DNS RESOLVER) # User input name server,

我已经用Python创建了一个简单的DNS解析器应用程序

#!/usr/bin/env python
import dns.resolver
import socket
from Tkinter import *
import Tkinter
import tkMessageBox

# GUI
root = Tkinter.Tk()
root.geometry("1200x300")
root.title("DNS RESOLVER)



# User input name server, from web address
def InputNameServer():
    NameServerEntryText = BoxTextNameServer.get()
    answers = dns.resolver.query(NameServerEntryText,'NS')
    var2 = 2
    for server in answers:
        DisplayTextNameServer = Label(root,text=server)
        DisplayTextNameServer.grid(row = var2, column = 5)
        var2 = var2 + 1
    return

BoxTextNameServer = StringVar()
InputIPAddrButton = Button(root, text = "Get the name server",command = InputNameServer)
InputIPAddrButton.grid(row = 0, column = 5)
InputIPAddrEntry = Entry(root, textvariable=BoxTextNameServer)
InputIPAddrEntry.grid(row = 1, column = 5)


root.mainloop()
基本前提是用户在文本框中输入网址,然后解析程序应通过导入的DNS解析程序获取名称服务器,并应添加各种名称服务器的标签。问题是当用户输入新的网址并按下提交按钮时,我无法删除它们。我理解.grid_forget()和.destroy()方法,但无法声明label变量,然后在函数运行之前删除它们,并在前面的标签的上方再次打印标签。
抱歉,如果我有太复杂的事情,简而言之,输入地址,按提交,打印标签,输入新地址,按提交,删除以前的标签,打印新标签。

当我缺少个人dns解析程序模块时,仍然很难有一个最小的工作示例。下次只需输入一个替代函数,如果它主要与您所问的问题无关,那么它将返回一些内容

无论如何,这就是我所说的:

from Tkinter import *
from ttk import *
import tkMessageBox

def dummy_DNS_Resolver():
    return "IT'S HARD TO HELP PEOPLE WHEN THEY GIVE "+\
            "MWE'S THAT NEED THEIR SPECIAL MODULES"

class DNSNameFrame(Frame):
    def __init__(self, parent):
        Frame.__init__(self, relief=RAISED, borderwidth=1)
        self.pack(side=RIGHT, fill=BOTH, expand=1)

        self.parent = parent

    def update(self):
        self.clearTable()

        servername = self.parent.ServerInputFrame.getServerName()
        for i in range(0, 10):
            Label(self, text=servername, relief=RIDGE).grid(row=i, column=0)
            Label(self, text=dummy_DNS_Resolver()).grid(row=i,column=1)

    def clearTable(self):
        for widget in self.winfo_children(): 
            widget.destroy()

class ServerInputFrame(Frame):
    def __init__(self, parent):
        Frame.__init__(self, relief=RAISED, borderwidth=1)
        self.pack(side=TOP, fill=Y, expand=1)

        Label(self, text="Enter Server:").pack(side=TOP)

        self.serverName = StringVar()
        self.entry = Entry(self, width=70, textvariable=self.serverName)
        self.entry.pack(side=TOP)

        Button(self, text="Run", width=30, command=parent.update).pack(side=BOTTOM)

    def getServerName(self):
        return self.serverName.get()


class MainWindow(Tk):
    def __init__(self, geom="1200x300", title="DNS RESOLVER"):
        Tk.__init__(self)
        self.title(title)
        self.geometry(geom)
        self.initGui()

    def initGui(self):
        self.DNSNameFrame = DNSNameFrame(self)
        self.ServerInputFrame = ServerInputFrame(self)

    def update(self):
        self.DNSNameFrame.update()

app = MainWindow()
app.mainloop()
它比人们通常使用的单一方式做Tkinter要长一些,但我发现它更简单,而且只需额外增加一个
\uuuuuu init\uuuu
函数。此外,每个框架子类都可以放在不同的文件中,然后导入到主窗口中,这样可以减少处理Tk时通常的混乱

分离GUI的逻辑工作单元有助于您单独处理每个工作单元,这更容易

您最感兴趣的部分应该是DNSNameFrame。在每次表更新之前,请清除表。您可以通过从ServerInputFrame中抓取位于大型机上的
self.parent
上的
servername
来填充表。您将其发送到dns模块并检索一些结果。您将遍历该结果并粘贴适当的服务器名。当我这样做的时候,我把它做成了一个表,但是现在我看到你只有一个列表,根据你的需要修改代码应该还是很容易的


适用于Ipython 2.7笔记本电脑,win7 x64

我们能得到一个工作的MWE吗?或者只是描述?从我看到的情况来看,您创建了带有文本“THS”的新标签,然后立即销毁这些标签(这应该会将它们从框架中删除,我们在框架中吗?),然后在标签下方和旁边添加一个新标签,并在标签下方和旁边添加永不销毁的新文本?为什么是空的回报?我的建议是有一个专用的框架来保存它,将其作为继承的框架对象,即DNSNameFrame,并为框架中的widget.winfo_children():widget.destroy()使用destroy方法。在打印新标签之前调用该方法。我将根据需要编辑代码。我不知道还要添加什么,上面复制到.py文件中的代码非常有效,根据我的定义和最简单的工作示例,也是如此。无论如何,谢谢你,虽然我不想在这里挑起争吵什么的,所以不要太在意。但我要说的是,它应该尽可能短(正确),但提供它工作(错误)和可验证(错误)所需的所有部分。在任何情况下,只要使用我给您的代码,通过更改
for
循环范围并用函数调用替换模块函数调用,您就应该让它按您需要的方式工作。