我在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()方法,但我无法声明标签变量,然后在函数运行之前删除它们,并再次在前面的标签顶部打印标签。 如果我有复杂的东西,请简单输入地址,按提交,打印标签,输入新地址,按提交,删除以前的标签,打印新标签。
答案 0 :(得分: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。在每个表更新之前清除表。您可以通过从servername
(即MainFrame)上的ServerInputFrame中抓取self.parent
来填充表格。您将其发送到您的DNS模块并检索一些结果。循环遍历该结果并粘贴相应的服务器名称。当我这样做时,我把它作为一个表,但现在我看到你只有一个列表,它应该仍然很容易根据你的需要修改代码。
适用于Ipython 2.7 Notebook,win7 x64。