Python Tk windows挂起了

时间:2015-10-30 12:31:27

标签: python python-2.7 tkinter

此代码基本上将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

1 个答案:

答案 0 :(得分:0)

tkinter(和大多数GUI工具包)的工作方式是它们依赖于稳定的事件流。有鼠标和键盘事件,但也有用于刷新显示和其他低级功能的事件。

当您在循环中调用sleep时,事件循环无法处理这些事件,从而导致GUI冻结。

如果要呈现倒计时器,则无限循环不是这样做的。 Tkinter小部件有一个名为after的方法,您可以使用它来安排将来调用的函数。

例如,您可以使用接受数字的函数。如果数字为零,它将退出。如果它不为零,则递减数字,然后在一秒钟内再次调用它。

例如,它可能看起来像这样:

def倒计时(延迟):     如果延迟== 0:         sys.exit()     打印“程序将以%s秒退出”%延迟     root.after(1000,倒计时,延迟-1)

当你像delay(10)一样调用它时,它会安排delay在一秒内再次调用,但以9为参数。它将继续递减值,直到它达到零,此时它将退出。

有关使用after的更多信息,这里有几个很好的资源:

  1. tkinter: how to use after method(stackoverflow)
  2. http://effbot.org/tkinterbook/widget.htm#Tkinter.Widget.after-method