Python Tkinter在由<function main\u Thread at…>启动的线程中出现未处理的异常

2024-04-20 15:01:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是OSX10.6.8、Python2.7.2和Tkinter 8.5版,我昨天清理了安装的Python、Tkinter和IDLE,清理了Python3.2的早期安装。我正在研究麻省理工学院开放式课件中的“RSS提要过滤器”问题集(不是为了学分),它包含了几个我没有编写也不理解的模块,其中一个模块(news_gui模块中的Popup类)抛出了一个未经处理的异常,我不知道如何调试。在

# 6.00 Problem Set 5
# RSS Feed Filter


import pdb
#pdb.set_trace()


import feedparser
import string
import time
from project_util import translate_html
from news_gui import Popup

#################################
########## CODE OMITTED #########
#################################

import thread

def main_thread(p):
    # A sample trigger list - you'll replace
    # this with something more configurable in Problem 11
    t1 = SubjectTrigger("Obama")
    t2 = SummaryTrigger("MIT")
    t3 = PhraseTrigger("Supreme Court")
    t4 = OrTrigger(t2, t3)
    triggerlist = [t1, t4]

    # TODO: Problem 11
    # After implementing readTriggerConfig, uncomment this line 
    #triggerlist = readTriggerConfig("triggers.txt")

    guidShown = []

    while True:
        print "Polling..."

        # Get stories from Google's Top Stories RSS news feed
        stories = process("http://news.google.com/?output=rss")
        # Get stories from Yahoo's Top Stories RSS news feed
        stories.extend(process("http://rss.news.yahoo.com/rss/topstories"))

        # Only select stories we're interested in
        stories = filter_stories(stories, triggerlist)

        # Don't print a story if we have already printed it before
        newstories = []
        for story in stories:
            if story.get_guid() not in guidShown:
                newstories.append(story)

        for story in newstories:
            guidShown.append(story.get_guid())
            p.newWindow(story)

        print "Sleeping..."
        time.sleep(SLEEPTIME)

SLEEPTIME = 60 #seconds -- how often we poll
if __name__ == '__main__':
    print '1'
    p = Popup()
    print '2'
    thread.start_new_thread(main_thread, (p,))
    print '3'
    p.start()
    print '4'

p.start()行(从底部开始的第二行)正在从news_gui模块调用Popup,代码如下:

^{pr2}$

当我在启用pdb的情况下运行时,我的输出是:

None
1
Popup init
2
3Polling...

Popup start
> /Users/**********/Desktop/Learn/CS Stuffs/6-00sc-spring-2011/6-00sc-spring-2011/contents/unit-2/lecture-12-introduction-to-simulation-and-random-walks/ps5/news_gui.py(31)start()
-> self.root.mainloop()
(Pdb) s
--Call--Unhandled exception in thread started by 
<function main_thread at 0x1026ed848>>
 /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py(1015)mainloop()
-> def mainloop(self, n=0):
(Pdb) s
> /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py(1017)mainloop()
-> self.tk.mainloop(n)
(Pdb) s

然后它就挂了。我知道这与线程和Tkinter有关,但我不知道下一步该怎么做。在

编辑:刚刚在Windows7虚拟机上安装了Python2.7.2,问题也发生在那里。在


Tags: 模块infromimporttkinterguithreadstart
1条回答
网友
1楼 · 发布于 2024-04-20 15:01:26

我找到了一个解决方案,尽管我不能说它的整体适用性。它可能会帮助处于类似困境中的其他人,但如果有更多知识渊博的人能够插话,那也会有帮助。在

我从http://tkinter.unpythonic.net/wiki/mtTkinter下载了mtTkinter。它说“修改后的代码拦截线程外的Tkinter调用,并通过一个队列封送它们,队列由主循环中周期性运行的‘after’事件读取。”。在

不知道具体怎么做,但它解决了问题。在

相关问题 更多 >