2016-04-15 4 views
0

Я создал простое приложение распознавателя DNS в PythonPython 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-резольвер и должны добавлять метки, спускаемые с разных серверов имен. Проблема в том, что я не могу удалить их, когда пользователь вводит новый веб-адрес и нажимает кнопку отправки. Я понимаю методы .grid_forget() и .destroy(), но не могу объявить переменную метки, а затем удалить их до запуска функции и снова напечатать метки поверх предыдущих. Извините, если у меня есть сложные вещи, вкратце введите адрес, нажмите «Отправить», напечатайте ярлыки, введите новый адрес, нажмите «Отправить», удалите предыдущие ярлыки, распечатайте новые ярлыки.

+1

Можем ли мы получить рабочее MWE? Или просто описания? Из того, что я вижу, вы создаете новые ярлыки с текстом «THS», а затем сразу же уничтожаете те (которые должны удалить их из фрейма, находимся ли мы в кадре?), А затем добавляем новый ярлык под и рядом с ним с новым текстом, который никогда не получает уничтожены? Почему пустое возвращение? Мой совет состоит в том, чтобы иметь выделенный Frame для этого, иметь его как унаследованный объект Frame, то есть DNSNameFrame, и иметь у него метод destroy с 'для виджета в frame.winfo_children(): widget.destroy()' в нем. Вызовите этот метод перед печатью новых ярлыков. – ljetibo

+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.

Разделение ваших логических рабочих единиц вашего графического интерфейса поможет вам справиться с каждым из них индивидуально, что проще.

Часть, которую вы больше всего интересуете, должна быть DNSNameFrame. Перед обновлением каждой таблицы вы очищаете таблицу. Вы заполняете таблицу, захватывая servername из вашего ServerInputFrame над self.parent, который является MainFrame. Вы отправляете это в свой модуль dns и получаете некоторый результат. Вы выполняете этот результат и вставляете соответствующие имена серверов. Когда я это сделал, я сделал это таблицей, но теперь я увидел, что у вас есть список, все равно достаточно легко изменить код для ваших нужд.

Работает на ноутбуке Ipython 2.7, win7 x64.

+0

Я не знаю, что еще добавить, код, который у меня выше при копировании в .py-файл, отлично работает, и по моему определению и минимальному рабочему примеру. Спасибо в любом случае, хотя –

+0

Я не пытаюсь выбрать драку здесь или что-то, поэтому не делайте этого с большим очагом. Но я говорю, что [MWE] (http://stackoverflow.com/help/mcve) должен быть таким коротким, как это может быть (true), но предоставить все части, необходимые для его работы (false) и быть поддающимися проверке (false) , В любом случае, просто используя код, который я дал вам, изменив диапазон циклов 'for' и заменив вызов функции для вызова функции модуля, вы должны заставить его работать так, как вам нужно. – ljetibo

Смежные вопросы