Python Tk窗口挂起

Python Tk窗口挂起,python,python-2.7,tkinter,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 askopenfilena

这段代码基本上将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
#/usr/bin/env python
从Tkinter进口*
导入请求、csv、时间、json、tkFileDialog
从lxml导入html,etree
从tkFileDialog导入askopenfilename
def倒计时(p,q):
i=p
j=q
k=0
尽管如此:
如果(j==-1):
j=59
i-=1
如果(j>9):
打印“\r”+str(k)+str(i)+”:“+str(j),
其他:
打印“\r”+str(k)+str(i)+”:“+str(k)+str(j),
时间。睡眠(1)
j-=1
如果(i==0和j==1):
打破
如果(i==0和j==1):
打印“\r goodbye!”
时间。睡眠(1)
链接=[]
root=Tk()
root.geometry('300x130')
label1=Label(root,text=“请输入搜索词”)
E1=条目(根,bd=5)
label2=标签(根,text=“请输入城市”)
E2=条目(根,bd=5)
def退出(自我):
self.root.destroy()
def getData():
a='再试一次'
全局搜索字符串,城市
Search_string=E1.get();
City=E2.get();
如果搜索字符串=='':
打印“请输入[必填字段]搜索词-(%s)”%a
打印“程序将在10秒后退出”
倒计时(0,10)
sys.exit()
elif City=='':
打印“请同时输入[必填字段]城市-(%s)”%a
打印“程序将在10秒后退出”
倒计时(0,10)
sys.exit()
其他:
打印搜索字符串“\n”,城市
root.destroy()
提交=按钮(root,text=“submit”,command=getData)
标签1.pack()
E1.pack()
标签2.pack()
E2.pack()
提交。包装(侧面=底部)
mainloop()
Search_string=Search_string.replace(“”,“+”)
部分链接链接链接1=(“https://www.google.com/search?q=");部分链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接链接
Tk().draw()
csvfile=tkFileDialog.asksaveasfile(mode='w',defaultextension=“.csv”)
i=0
当我<40时:
url=partial_link_1+Search_string++'+'+'+'+City+partial_link_2+'&start='+str(i)
i+=10
links.append(url)
对于链接中的i:打印“链接=%r”%i
tkinter(以及大多数GUI工具包)的工作方式是,它们依赖于稳定的事件流。有鼠标和键盘事件,但也有刷新显示和其他低级功能的事件

在循环中调用sleep时,事件循环无法处理这些事件,这会导致GUI冻结

如果你想呈现一个倒计时,无限循环不是实现它的方法。Tkinter小部件在之后有一个名为
的方法,您可以使用该方法来计划将来调用的函数

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

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

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

当您像
delay(10)
那样调用它时,它将计划在一秒钟内再次调用
delay
,但参数为9。它将继续递减该值,直到它达到零,然后退出

有关在
之后使用
的更多信息,请参阅以下几个好资源:

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

    在循环中调用sleep时,事件循环无法处理这些事件,这会导致GUI冻结

    如果你想呈现一个倒计时,无限循环不是实现它的方法。Tkinter小部件在
    之后有一个名为
    的方法,您可以使用该方法来计划将来调用的函数

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

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

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

    当您像
    delay(10)
    那样调用它时,它将计划在一秒钟内再次调用
    delay
    ,但参数为9。它将继续递减该值,直到它达到零,然后退出

    有关在
    之后使用
    的更多信息,请参阅以下几个好资源:

  • (堆栈溢出)

  • root.mainloop()。在应用程序销毁之前,
    mainloop()
    之后不会运行任何操作。您是否知道
    Tk().draw()
    正在创建第二个根窗口?从(root.mainloop())中删除根或删除Tk().draw()都不能解决问题。在(If-else)条件sys.exit()中,python外壳将退出,退出代码为0,但Tk窗口不会closes@ShekharSamanta:如果调用
    sys.exit()
    ,窗口必须关闭。我想你可能误解了你所看到的。当我运行代码时,输入一个搜索词和城市,它会提示我输入一个文件,然后程序退出,正如我所期望的那样。@Bryan Oakley,感谢您测试代码,请尝试将其中一个字段保留为空(搜索字符串或城市),然后单击“提交”,它将退出python shell,但是TK窗口将保持不变并没有响应。
    root.mainloop()
    显示为除最后一行代码以外的任何内容都是一个坏迹象。货到付款后什么都没有