Python 停止Tkinter中的tweepy流

Python 停止Tkinter中的tweepy流,python,loops,tkinter,tweepy,Python,Loops,Tkinter,Tweepy,我正在尝试使用TkinterGUI使用python/tweepy来流式传输推文。理想情况下,我会有一个启动流的“开始”按钮和一个停止流的“停止”按钮。下一个示例(来自stackoverflow)以一种简化的方式展示了我试图实现的目标: import Tkinter as tk import threading class App(): def __init__(self, master): self.isrecording = False self.bu

我正在尝试使用TkinterGUI使用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()
将Tkinter作为tk导入
导入线程
类App():
定义初始(自我,主):
self.isrecording=False
self.button1=tk.Button(main,text='start')
self.button2=tk.Button(main,text='stop')
self.button1.bind(“,self.startrecording)
self.button2.bind(“,self.stoprecording)
self.button1.pack()
self.button2.pack()
def开始记录(自身、事件):
self.isrecording=True
t=线程。线程(目标=自身记录)
t、 开始()
def停止录制(自身、事件):
self.isrecording=False
打印“\n停止”
def_记录(自):
自我记录时:
打印“下载推文”
main=tk.tk()
应用程序=应用程序(主)
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()
从Tkinter导入*
导入线程
导入编解码器
导入urllib、json、tweepy、time
从日期时间导入日期时间
从tweepy导入流
从tweepy导入OAuthHandler
从tweepy.streaming导入StreamListener
消费者密钥=“”
消费者_secret=“”
access_key=“”
access_secret=“”
auth=OAuthHandler(使用者密钥,使用者密钥)
授权设置访问令牌(访问密钥、访问密钥)
关键字=“波兰”
类App():
定义初始(自我,主):
self.isrecording=False
self.button1=按钮(main,text='start')
self.button2=按钮(main,text='stop')
self.button1.bind(“,self.startrecording)
self.button2.bind(“,self.stoprecording)
self.button1.pack()
self.button2.pack()
def开始记录(自身、事件):
self.isrecording=True
t=线程。线程(目标=自身记录)
t、 开始()
def停止录制(自身、事件):
self.isrecording=False
def_记录(自):
自我记录时:
类侦听器(StreamListener):
def on_数据(自身、数据):
imageFolder=“H:\Bogdan\imageFolder”
decoded=json.load(数据)
encoded=已解码['text']。编码('ascii','ignore')
如果“http”未编码:
encodedStrip=encoded.translate(无、@、/、\\、“、:、|、?、*”).replace(“\n”、”)
打印编码条
如果解码[‘实体’]中的“媒体”:
对于解码['extended_entities']['media']中的值:
imageLink=value['media\u url']
urllib.urlretrieve(imageLink,imageFolder+“\\”+encodedStrip+“\”+str(time.time())+“.jpg”)
打印“下载…”
返回真值
其他:
encodedHTTP=encoded[:encoded.index(“http”)-2]
encodedStrip=encodedHTTP.translate(无、@、/、\\、“、:、|、?、*”)。替换(“\n”、”)
打印编码条
如果解码[‘实体’]中的“媒体”:
对于解码['extended_entities']['media']中的值:
imageLink=value['media\u url']
urllib.urlretrieve(imageLink,imageFolder+“\\”+encodedStrip+“\”+str(time.time())+“.jpg”)
打印“下载…”
返回真值
def on_错误(自身、状态):
打印状态
twitterStream=流(auth,listener())
twitterStream.filter(跟踪=[关键字])
main=Tk()
应用程序=应用程序(主)
main.mainloop()
你知道我要做什么改变才能让它工作吗


多谢各位

我猜您的代码的问题是,您在
循环中初始化了一个流对象,而
循环中,您必须了解
对象本身包含一个无限循环,它不断地寻找新的流推特。因此,一旦初始化
对象,它将自动运行,直到您手动终止进程,因此在
while
循环下初始化
对象没有意义

您需要遵循的策略是:

  • 按下启动按钮时,初始化
    对象
  • 按下停止按钮时停止流媒体
通过编辑
on\u data()
方法可以轻松实现此行为,您可以在
on\u data()
方法中写入
return True
的末尾添加以下行:

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

我对tkinter了解不多,但我可以告诉你“停止”按钮不起作用的原因,因为你没有停止流

类侦听器(StreamListener)中:
您需要指定
twitterStream.disconnect()
。这将停止您与流式API之间的连接

可以添加以下内容:

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

谢谢你的评论。不幸的是,listener类中无法识别“isrecording”属性。我得到这个错误:AttributeError:“listener”对象没有属性“isrecording”。如果您创建一个名为
isrecording
的全局变量,效果会更好。