【问题标题】:Python Tk windows hangs upPython Tk windows 挂了
【发布时间】:2015-10-30 12:31:26
【问题描述】:

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

【问题讨论】:

  • root.mainloop() 显示为除最后一行代码之外的任何内容是一个不好的信号。 mainloop() 之后什么都不会运行,直到应用程序被销毁。
  • 您知道Tk().withdraw() 正在创建一个第二个 根窗口吗?
  • 从 (root.mainloop()) 中删除根或删除 Tk().withdraw() 都不能解决问题。 (If else) 条件 sys.exit() 中的某些内容,python shell 以退出代码 0 退出,但 Tk 窗口没有关闭
  • @ShekharSamanta:如果你打电话给sys.exit(),窗口必须关闭。我认为您可能误解了您所看到的内容。当我运行您的代码时,输​​入搜索词和城市,它会提示我输入文件,然后程序退出,正如我所期望的那样。
  • @Bryan Oakley,感谢您测试代码,尝试将其中一个字段留空 Search_string 或 City ,然后单击 Submit ,它将退出 python shell,但 TK 窗口将保持不变并继续没有反应。

标签: python python-2.7 tkinter


【解决方案1】:

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

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

如果你想展示一个倒数计时器,那么无限循环不是实现它的方法。 Tkinter 小部件有一个名为 after 的方法,您可以使用它来安排将来调用的函数。

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

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

def 倒计时(延迟): 如果延迟 == 0: sys.exit() print "程序将在 %s 秒后退出" % 延迟 root.after(1000, 倒计时, delay-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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 2014-03-03
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 2011-05-31
    相关资源
    最近更新 更多