此代码基本上将2个用户输入作为字符串&稍后使用它们来形成URL
运行此代码后,如果(if或elif)条件为False,则TK窗口会挂起(冻结),这是代码。
有人请帮忙。请参阅下面的代码。
#!/usr/bin/env python
from Tkinter import *
import requests, csv, time, json, tkFileDialog
from lxml import html, etree
from tkFileDialog import askopenfilename
def countdown(p,q):
i=p
j=q
k=0
while True:
if(j==-1):
j=59
i-=1
if(j > 9):
print "\r"+str(k)+str(i)+":"+str(j),
else:
print "\r"+str(k)+str(i)+":"+str(k)+str(j),
time.sleep(1)
j -= 1
if(i==0 and j==-1):
break
if(i==0 and j==-1):
print "\rGoodbye!"
time.sleep(1)
links = []
root = Tk()
root.geometry('300x130')
label1 = Label( root, text="Please Enter Search Term")
E1 = Entry(root, bd =5)
label2 = Label( root, text="Please enter City")
E2 = Entry(root, bd =5)
def quit(self):
self.root.destroy()
def getData():
a = 'try again'
global Search_string, City
Search_string = E1.get();
City = E2.get();
if Search_string == '':
print 'Please enter [mandatory field] Search Term - (%s)' % a
print 'Program will exit in 10 seconds'
countdown(0,10)
sys.exit()
elif City == '':
print 'Please enter [mandatory field] City also - (%s)' % a
print 'Program will exit in 10 seconds'
countdown(0,10)
sys.exit()
else:
print Search_string,'\n',City
root.destroy()
submit = Button(root, text ="Submit", command = getData)
label1.pack()
E1.pack()
label2.pack()
E2.pack()
submit.pack(side=BOTTOM)
mainloop()
Search_string = Search_string.replace(' ','+')
partial_link_1 = ("https://www.google.com/search?q=");partial_link_2 = '&num=10'
Tk().withdraw()
csvfile = tkFileDialog.asksaveasfile(mode='w', defaultextension=".csv")
i = 0
while i < 40:
url = partial_link_1+Search_string+'+'+'in'+'+'+City+partial_link_2+'&start='+str(i)
i+=10
links.append(url)
for i in links: print "Links = %r"%i
答案 0 :(得分:0)
tkinter(和大多数GUI工具包)的工作方式是它们依赖于稳定的事件流。有鼠标和键盘事件,但也有用于刷新显示和其他低级功能的事件。
当您在循环中调用sleep时,事件循环无法处理这些事件,从而导致GUI冻结。
如果要呈现倒计时器,则无限循环不是这样做的。 Tkinter小部件有一个名为after
的方法,您可以使用它来安排将来调用的函数。
例如,您可以使用接受数字的函数。如果数字为零,它将退出。如果它不为零,则递减数字,然后在一秒钟内再次调用它。
例如,它可能看起来像这样:
def倒计时(延迟): 如果延迟== 0: sys.exit() 打印“程序将以%s秒退出”%延迟 root.after(1000,倒计时,延迟-1)
当你像delay(10)
一样调用它时,它会安排delay
在一秒内再次调用,但以9为参数。它将继续递减值,直到它达到零,此时它将退出。
有关使用after
的更多信息,这里有几个很好的资源: