我正在尝试使用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()
我试图将此应用到我的代码中,开始按钮工作正常,完成了它应该做的所有事情,但停止按钮没有做任何事情。窗口没有冻结或任何东西,只是停止按钮没有效果。由于什么事也没有发生,溪流还在继续。我在这里发布我的代码:
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了解不多,但我可以告诉你“停止”按钮不起作用的原因,因为你没有停止流。
在类侦听器(StreamListener)中:
您需要指定twitterStream。断开连接()
。这将停止您与流式API之间的连接。
可以添加以下内容:
while isrecording:
## enter code here
else:
## anything that might apply
我猜你的代码的问题是,你在循环中初始化了一个流对象,你必须明白
Stream
对象本身包含一个无限循环,它不断寻找新的流推文。因此,一旦您初始化了一个Stream
对象,它将自动运行,直到您手动终止进程,因此在循环时,在
下初始化
Stream
对象是没有意义的
您需要遵循的策略是:
当按下开始按钮时初始化Stream
对象。
- 当按下停止按钮时停止流。
通过编辑
on\u data()
方法可以轻松实现此行为,您可以在on\u data()
方法中写入return True
的末尾添加以下行:
if isrecording: #Initialise a variable named isrecording.
return True
else:
return False
我正在尝试使用Stream.filter()方法将twitter数据流式传输一段时间,比如5分钟。我正在将检索到的推文存储在JSON文件中。问题是我无法从程序中停止过滤器()方法。我需要手动停止执行。我尝试使用时间包根据系统时间停止数据。我能够停止向JSON文件写入推文,但流方法仍在继续,但它无法继续到下一行代码。我正在使用IPython笔记本编写和执行代码。代码如下: 这些链接是相似的,但我不会
我有一个程序,它每秒钟响一次,直到停止。问题是,在我按下“开始”并发出嘟嘟声后,我无法单击“停止”按钮,因为窗口冻结。欢迎任何帮助。
我试图创建一个简单的pythongui(使用Tkinter),其中包含start按钮,在线程中运行while循环,以及停止while循环的stop按钮。 我对停止按钮有问题,它不会停止任何东西,一旦单击开始按钮,就会冻结GUI。 见下面的代码: 知道怎么解决这个问题吗?我肯定这是微不足道的,一定做了成千上万次,但我自己找不到解决办法。 谢谢大卫
问题内容: 我在停止“供稿”时遇到问题;cancel参数似乎对after方法没有任何影响。尽管“进纸停止”已打印到控制台。 我尝试使用一个按钮将启动供稿,而另一个按钮将停止供稿。 随着输出: 问题答案: 问题是,即使你打电话与停止循环,已经有等待消防挂起的工作。按下停止按钮不会触发新的作业,但是旧的作业仍然存在,并且当它自己调用时,它将传入False,这将导致循环继续。 您需要取消待处理的作业,以
我希望Tweepy Streaming API在我将x#条推文存储在MongoDB中后停止推文。 我尝试了类内的IF和WHILE语句,用计数器定义,但不能让它停止在一定的X量。这对我来说是一个真正的爆头。我在这里找到了这个链接:https://groups.google.com/forum/#!Tweepy/5IGlu2qiug4但是我复制这个的努力失败了。它总是告诉我init需要一个额外的参数。
问题内容: 我正在将X#条tweets存储在MongoDB中之后,希望Tweepy Streaming API停止提取tweets。 我已经在类中尝试了IF和WHILE语句,并用计数器定义,但是无法使其停止在一定的X量处。对我来说这真是个危险。我在以下位置找到了此链接:https : //groups.google.com/forum/#!topic/tweepy/5IGlu2Qiug4, 但是我