我正在讨论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()
答案 0 :(得分:5)
使用线程很简单,真的。您所要做的就是导入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 :(得分:1)
然后解决方案很简单,经过大约一周的查看(这是我的代码的浓缩版本):
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.
希望这有帮助!