Display a label while pressing the button in my GUI

Peter Otten __peter__ at web.de
Mon Jan 30 04:31:01 EST 2017


hmmeeranrizvi18 at gmail.com wrote:

> Hello Guys,
> Here i am creating a GUI which will act as a search engine that will find
> the results from the browser and save the results as a xls file. When i
> typed something in my search box and click the (GO)button.It should
> display search in progress.when the file is saved it should display done.
> How to do that? My button gets hung for a seconds.We should give any
> timeout for that?

Move the actual processing into another thread and have it communicate with 
your GUI through a Queue. Here's a sketch:

import Queue
import threading

from Tkinter import *
import mechanize

def clear_search(event):
    search.delete(0, END)

def start_search():
    thread = threading.Thread(
        target=fun,
        args=(search.get(),)
    )
    thread.setDaemon(True)
    thread.start()
    root.after(100, check_state)

def fun(new):
    queue.put("searching")
    url = "http://duckduckgo.com/html"
    br = mechanize.Browser()
    br.set_handle_robots(False)
    br.open(url)
    br.select_form(name="x")
    br["q"] = str(new)
    res = br.submit()
    queue.put("writing result")
    content = res.read()
    with open("result1.xls", "w") as f:
        f.write(content)
    queue.put("done")

def check_state():
    while True:
        try:
            message = queue.get_nowait()
        except Queue.Empty:
            break
        state_info["text"] = message
        if message == "done":
            return
    root.after(100, check_state)

queue = Queue.Queue()
root = Tk()

top_findings = Label(root, text="Top Findings:", font="-weight bold")
top_findings.pack()

search = Entry(root, width=100)
search.insert(0, "Enter the value to search")

# Did you see Christian Gollwitzer's post?
search.bind("<FocusIn>", clear_search)

search.pack()

go_button = Button(root, text="GO", width=5, command=start_search)
go_button.pack()

state_info = Label(root)
state_info.pack()

root.mainloop()





More information about the Python-list mailing list