Кнопка питона tkinter запускается в фоновом режиме - PullRequest
1 голос
/ 31 октября 2010

Я возился с Tkinter и Python.У меня есть основной графический интерфейс с парой кнопок, одна кнопка уходит и делает что-то, что занимает некоторое время, которое является переменным.Проблема в том, что когда я нажимаю на эту кнопку, весь мой графический интерфейс блокируется / не отображается правильно - я думаю, потому что он пытается выполнить эти вещи, которые занимают некоторое время, и он блокирует графический интерфейс.

Я посмотрелв потоки и очереди, но я не могу понять это.Я думаю, мне нужно запустить мой метод поиска в потоке, а затем поставить в очередь результаты, когда они возвращаются, и обновлять список по мере их возвращения?

Я нахожусь в 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()

Ответы [ 2 ]

5 голосов
/ 22 февраля 2012

Использование потоков очень просто.Все, что вам нужно сделать, это импортировать класс Thread:

from threading import Thread

и изменить функцию 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)

Это должно быть все, что вам нужно сделать, так какЯ почти уверен, что Tkinter поточно-ориентирован.В противном случае вам придется создать один поток, который вставит результаты другого потока в текстовый виджет.

Кроме того, это Python.Неважно, на окнах вы или нет: D

1 голос
/ 14 декабря 2011

У меня была такая же проблема до сегодняшнего дня! Ваша проблема заключается в том, что основной цикл Tkinter вмешивается в ваш цикл задач. Мне пришлось убрать все классы из моей программы и использовать только функции. Кнопка, которую вы используете, переключит переменную, которая затем запустит задачу цикла.

Тогда решение простое, примерно через неделю поиска (это сжатая версия моего кода):

   scnBtn = Button(Frame, text="Update", command=readIt)
   scnBtn.pack()


def readIt(): ## this is the variable the button changes
    global read

    read = 1
    TK.after(0, readFile) ##this is how you make sure the GUI doesn't freeze up

def readFile(): ## this is the task you want the button to do
    global read

    if read == 1:

        "your task"

        if "task is over"

            read = 0

    if read == 1:
        TK.after(0, readFile) ## this will keep the task going until its done.

Надеюсь, это помогло!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...