twitter api和tkinter - python 2.7.8

时间:2014-10-29 12:18:48

标签: python twitter tkinter

我在GUI程序中发送推文。每条推文都附加到Tkinter的TEXT小部件中。代码如下:

from tweepy import Stream
from tweepy import OAuthHandler
from tweepy.streaming import StreamListener
import time
import json
from threading import Thread
from Tkinter import *


ckey='xxx'
csecret='xxx'
atoken='xxx'
asecret='xxx'

tweetQ=[]

tweet_no=0
stream_created=0

def processT(tweet):
    global tweet_no
    global tweet_box
    tweet_no+=1
    if 'text' in tweet:
        text = tweet['text'].encode('ascii', 'ignore')
        date = tweet['created_at']
        tweet_box.insert(END,str(tweet_no)+"\t"+str(date)+"\t"+str(text)+"\n")
        tweet_box.update_idletasks()
        tweet_box.yview(END)

class listener(StreamListener):
    def on_data(self,data):
        try:
            tweet=json.loads(data)
            t=Thread(target=processT,args=(tweet,))
            t.start()
            t.join()
            return True

        except BaseException ,e:
            print "Failed on_data, ",str(e)

    def on_error(self,status):
        print status
        time.sleep(3)

def actFromTo(i):
    if i==0:
        option_real.select()
        option_time.deselect()
    else:
        option_real.deselect()
        option_time.select()



def main():
    global stream_created
    try:
        auth = OAuthHandler(ckey,csecret)
        auth.set_access_token(atoken,asecret)
        if stream_created==0:
            stream_created=1
            twitterStream=Stream(auth,listener())
            twitterStream.filter(locations=[-122.75,36.8,-121.75,37.8,-74,40,-73,41])
        else:
            delete(twitterStream)


    except BaseException ,e:
        stream_created=0
        print "Failed main, ",str(e)



root= Tk()
root.title("Twitter Monitor")

left_f = Frame(root)
right_f = Frame(root)


v = StringVar()
v.set(["selection"])
option_real = Radiobutton(left_f,variable=v,text="Realtime",value=1,command=lambda:actFromTo(0))
option_real.grid(row=0,column=0,sticky=(W))
option_real.select()
option_time=Radiobutton(left_f,variable=v,text="Time period",value=2,command=lambda:actFromTo(1))
option_time.grid(row=1,column=0,sticky=(W))
frm = Label(left_f,text="FROM > ")
frm.grid(row=2,column=1,sticky=(E))
frm_f = Entry(left_f,width=10,state=DISABLED)
frm_f.grid(row=2,column=2,sticky=(E))

to = Label(left_f,text="TO > ")
to.grid(row=2,column=3,sticky=(E))
to_f = Entry(left_f,width=10,state=DISABLED)
to_f.grid(row=2,column=4,sticky=(E))


tweet_box = Text(right_f,width=80)

scrollbar = Scrollbar(right_f, orient="vertical")
scrollbar.config(command=tweet_box.yview)

tweet_box.config(yscrollcommand=scrollbar.set)
scrollbar.pack(side='right')
tweet_box.pack(side='right')

launch = Button(left_f,text="<< START >>",command=main)
launch.grid(row=3,column=0,sticky=(E))


left_f.pack(side=LEFT,padx=20,pady=20)
right_f.pack(side=RIGHT,padx=20,pady=20)
root.mainloop()

我有一个开始按钮,用于启动流式传输过程。该程序工作正常,但只要我触摸GUI窗口或再次按下开始按钮或使用滚动条,程序就会进入NOT RESPONDING状态。

我使用的是Windows 7 32位和Python 2.7.8。可能的原因是什么?我甚至尝试创建一个单独的线程来执行该过程但问题仍然存在......

1 个答案:

答案 0 :(得分:0)

Tkinter不是线程安全的。您只能从创建窗口小部件的同一线程访问窗口小部件的方法。