的Python的Tkinter删除标签,他们已被添加之前

问题描述:

我已经在Python的Python的Tkinter删除标签,他们已被添加之前

#!/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解析应用程序的基本前提是,用户输入在文本框中的网页地址,解析器则应该得到名称服务器通过导入的DNS解析器添加,并应添加各种名称服务器上的标签。问题是我无法在用户输入新的网址并按下提交按钮时删除它们。我了解.grid_forget()和.destroy()方法,但无法声明标签变量,然后在函数运行之前将其删除,并在前面的顶部重新打印标签。 道歉,如果我有复杂的事情,简而言之输入地址,按提交,打印标签,输入新地址,按提交,删除以前的标签,打印新的标签。

+1

我们可以得到一个可用的MWE吗?或只是描述?从我看到你创建带有文本“THS”的新标签,然后立即销毁那些(它们应该从框架中移除它们,我们是否在框架中?),然后在它们旁边和旁边添加一个新标签,摧毁?为什么空回来?我的建议是有一个专用的框架来保存它,把它作为一个继承的框架对象,即DNSNameFrame,并让它具有一个销毁方法,在框架中使用frame.winfo_children():widget.destroy()。在打印新标签之前调用该方法。 – ljetibo

+0

我将相应地编辑代码 –

仍然很难有一个最小工作例如,当我丢失个人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的的平均单片路更加漫长了一点,但我觉得这样更容易和所有只为成本1额外的__init__功能。此外,每个Frame子类可以放在不同的文件中,然后导入到MainWindow中,这样在处理Tk时可以减少通常的混乱。

分离GUI的逻辑工作单元可以帮助您更轻松地处理每个单元。

你最感兴趣的部分应该是DNSNameFrame。在每次更新表格之前清除表格。您通过在MainFrame的self.parent上从ServerInputFrame获取servername来填充表格。你发送到你的DNS模块并检索一些结果。您可以遍历该结果并粘贴相应的服务器名称。当我做到了时,我将它制成桌子,但现在我看到你只是有一个列表,它应该仍然很容易修改代码以满足您的需求。

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

+0

我不知道还有什么要添加的,当我将上面的代码复制到.py文件中时,上面的代码完美地工作,所以是我的定义和最小的工作示例。不过谢谢 –

+0

我不想在这里选择一场战斗或是别的什么东西,所以不要多花点心思。但我的意思是[MWE](http://*.com/help/mcve)应该尽可能短(true),但要提供所需的所有部分(false)并且可以验证(false) 。在任何情况下,只要使用我通过改变'for'循环范围给你的代码,并用你的模块函数调用的函数调用代替,就可以让它按照你的需要工作。 – ljetibo