tkinter python按钮在后台命令中运行

1 python tkinter

我正在讨论Tkinter和Python.我有一个基本的gui,上面有几个按钮,一个按钮消失,做了一些需要花费一些时间的东西,这是可变的.问题是,当我按下这个按钮时,我的整个gui锁定/没有正确显示 - 我猜是因为它试图做这些需要花费一些时间并阻止gui的东西.

我已经研究过线程和队列,但我无法弄明白.我想我需要在一个线程上启动我的查找方法,然后在它们返回时对结果进行排队,并在返回时更新列表框?

我在Windows上,如果这对我使用线程的方式有所不同.

亲切的问候

大卫

基本代码如下.

class Search:

        def __init__(self, master):

            self.seeds = []

            frame = Frame(master, width=700, height=500)
            frame.pack_propagate(0)
            frame.pack(expand=YES, fill=BOTH)

            #
            # Search results
            #
            l2 = Label(frame, text="results")
            l2.pack(anchor=W)
            self.resultfield = Listbox(frame, selectmode=BROWSE)
            self.resultfield.grid(row=3, column=1, sticky=N+W+S+E, columnspan=3)
            self.resultfield.pack(fill=BOTH)

            frame1 = Frame(frame)
            frame1.pack()


            # Button to action the search
            self.getSearchbut = Button(frame1, text="Do Search", command=self.getSearch)
            self.getSearchbut.grid(row=1, column=2)
            self.getSearchbut.pack()

        def getSearch(self):


            sa = SearchApi(self.seeds)

            results = sa.lookup(self)


            for result in results:
                self.resultfield.insert(END, user)

        def putCSV(self):
            print "put the csv files"

class SearchApi: 

        def __init__(self, seeds):
            self.seeds = seeds

        def lookup(self):
            results = []
                # I do something here that takes a while
                return results




if __name__ == "__main__":

    root = Tk()
    root.title("Search")

    app = Search(root)

    root.mainloop()
Run Code Online (Sandbox Code Playgroud)

Ara*_*Fey 5

使用线程很简单,真的.您所要做的就是导入Thread类:

from threading import Thread
Run Code Online (Sandbox Code Playgroud)

并将getSearch函数更改为如下所示:

def getSearch(self):
    t= Thread(target=self.search)#this should work, in case it doesn't, try "t= Thread(target=Search.getSearch,args=[self])" instead.
    t.start()

def search(self):
    sa = SearchApi(self.seeds)
    results = sa.lookup(self)
    for result in results:
        self.resultfield.insert(END, user)
Run Code Online (Sandbox Code Playgroud)

这应该是您需要做的所有事情,因为我非常确定Tkinter是线程安全的.如果不是,您将必须创建一个线程将其他线程的结果插入到文本小部件中.

另外,这是Python.无论你是否在窗户上都没关系:D