簡體   English   中英

停止Tkinter中的tweepy流

[英]Stop tweepy streaming in Tkinter

我正在嘗試使用tkinter GUI使用python / tweepy流推文。 理想情況下,我將有一個“開始”按鈕來啟動流,並有一個“停止”按鈕來停止流。 下一個示例(來自stackoverflow)以簡化的方式顯示了我嘗試實現的目標:

import Tkinter as tk
import threading

class App():
    def __init__(self, master):
        self.isrecording = False
        self.button1 = tk.Button(main, text='start')
        self.button2 = tk.Button(main, text='stop')

        self.button1.bind("<Button-1>", self.startrecording)
        self.button2.bind("<Button-1>", self.stoprecording)
        self.button1.pack()
        self.button2.pack()

    def startrecording(self, event):
        self.isrecording = True
        t = threading.Thread(target=self._record)
        t.start()

    def stoprecording(self, event):
        self.isrecording = False
        print "\nStopped"

    def _record(self):
        while self.isrecording:
            print "Downloading tweets"

main = tk.Tk()
app = App(main)
main.mainloop()

我試圖將其應用到我的代碼中,“開始”按鈕可以正常工作,並且可以完成它應該做的所有事情,但是“停止”按鈕卻什么也沒做。 窗口沒有凍結或任何停止,只是停止按鈕無效。 由於沒有任何反應,流繼續進行。 我在這里發布我的代碼:

from Tkinter import *
import threading
import codecs
import urllib, json, tweepy,time
from datetime import datetime
from tweepy import Stream
from tweepy import OAuthHandler
from tweepy.streaming import StreamListener

consumer_key = ""
consumer_secret = ""
access_key = ""
access_secret = ""
auth = OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_key, access_secret)
keyword = "Poland"

class App():
    def __init__(self, master):
        self.isrecording = False
        self.button1 = Button(main, text='start')
        self.button2 = Button(main, text='stop')
        self.button1.bind("<Button-1>", self.startrecording)
        self.button2.bind("<Button-1>", self.stoprecording)
        self.button1.pack()
        self.button2.pack()

    def startrecording(self,event):
        self.isrecording = True
        t = threading.Thread(target=self._record)
        t.start()

    def stoprecording(self, event):
        self.isrecording = False

    def _record(self):
        while self.isrecording:
            class listener(StreamListener):
                def on_data(self,data):
                    imageFolder = "H:\Bogdan\imageFolder"
                    decoded = json.loads(data)
                    encoded = decoded['text'].encode('ascii','ignore')
                    if "http" not in encoded:
                        encodedStrip = encoded.translate(None, '@,/,\\,",<,>,:,|,?,*').replace("\n","")
                        print encodedStrip
                        if "media" in decoded['entities']:
                            for value in decoded['extended_entities']['media']:
                                imageLink = value['media_url']
                                urllib.urlretrieve(imageLink, imageFolder+"\\"+encodedStrip+"_"+str(time.time())+".jpg")
                        print 'downloading...'
                        return True

                    else:
                        encodedHTTP = encoded[:encoded.index("http")-2]
                        encodedStrip = encodedHTTP.translate(None, '@,/,\\,",<,>,:,|,?,*').replace("\n","")
                        print encodedStrip
                        if "media" in decoded['entities']:
                            for value in decoded['extended_entities']['media']:
                                imageLink = value['media_url']
                                urllib.urlretrieve(imageLink, imageFolder+"\\"+encodedStrip+"_"+str(time.time())+".jpg")
                        print 'downloading...'
                        return True
                def on_error(self,status):
                    print status

            twitterStream = Stream(auth,listener())
            twitterStream.filter( track = [keyword] )



main = Tk()
app = App(main)
main.mainloop()

對我必須進行哪些更改才能使其正常工作有任何想法嗎?

非常感謝你!

我猜代碼的問題是,您在while循環中初始化了一個流對象,您必須了解Stream對象在其內部包含一個無限循環,該循環不斷尋找新的流推文。 因此,一旦初始化Stream對象,它將自動運行,直到您手動終止該進程為止,因此在while循環下初始化Stream對象沒有任何意義。

您需要遵循的策略是:

  • 當按下開始按鈕時,初始化Stream對象。
  • 當按下停止按鈕時, 停止流式傳輸。

通過編輯on_data()方法可以輕松實現此行為,您可以在on_data()方法的寫入return True的末尾添加以下幾行:

if isrecording: #Initialise a variable named isrecording.
    return True
else:
    return False

我對tkinter的了解不多,但是我可以告訴您“停止”按鈕不起作用的原因,因為您沒有停止流。

class listener(StreamListener):您需要指定twitterStream.disconnect() 這將停止您與Streaming API之間的連接。

可以添加以下內容:

while isrecording:
    ## enter code here
else:
    ## anything that might apply

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM