我怎样才能 运行 与 tkinter 一起不断循环的东西?
How can I run something that loops constantly alongside tkinter?
好吧,我的计划是制作一个程序来识别推文中的关键字并在 tkinter 中显示推文。本质上,每次推文被识别时,我都希望它更新 tkinter 中的标签。
我确实知道如何使用 Twython 实现流来执行此操作,但我的问题是我无法同时拥有流和 tkinter 运行。我考虑过线程化,我尝试过,但我没有线程化经验,可能做错了。
这只是我制作更复杂的东西的垫脚石类型的项目,但这很可能是无关紧要的。有人可以指出我正确的方向吗?这是我的代码:
from tkinter import *
from threading import Thread
from twython import Twython
from twython import TwythonStreamer
import time
APP_KEY = 'X'
APP_SECRET = 'X'
OAUTH_TOKEN = 'X'
OAUTH_TOKEN_SECRET = 'X'
TRACKING_TERM = 'something'
tweet_text = StringVar
WINDOW_SIZE_X = 1600
WINDOW_SIZE_Y = 300
WINDOW_SIZE_STRING = str(WINDOW_SIZE_X) + 'x' + str(WINDOW_SIZE_Y)
class Window(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.master = master
t = Thread(target=self.start_stream())
t.start()
self.init_window()
def init_window(self):
self.master.title('Twitter Streamer')
self.pack(fill=BOTH, expand=True)
self.label = Label(self, textvariable=tweet_text)
self.label.place(x=0, y=0)
def start_stream(self):
stream.statuses.filter(track=TRACKING_TERM)
# JWStreamer class is created to handle the streaming
class JWStreamer(TwythonStreamer):
def on_success(self, data):
if 'text' in data:
tweet_text = data['text'].encode('utf-8')
def on_error(self, status_code, data):
print('Error:', status_code)
# To disconnect on error uncomment the next line
# self.disconnect()
print('Waiting 60 seconds to reconnect...')
time.sleep(60)
# Twitter Object
twitter = Twython(APP_KEY,
APP_SECRET,
OAUTH_TOKEN,
OAUTH_TOKEN_SECRET)
# Steamer Object
stream = JWStreamer(APP_KEY,
APP_SECRET,
OAUTH_TOKEN,
OAUTH_TOKEN_SECRET)
root = Tk()
root.geometry(WINDOW_SIZE_STRING)
app = Window(root)
root.mainloop()
如果我的代码现在看起来有些草率,我深表歉意。你现在看到的是令人沮丧地四处移动东西只是为了让一些东西工作的结果。
这可能是一种低质量的解决方法,但我很确定它已被普遍接受。在 root
上使用 after()
方法。
我没用过,但我知道它可以让你在一段时间后调用一个函数。这是 link 到 docs and some questions。
你得去看看它,因为就像我说的,我以前没有用过它,但认为它可能对你有帮助。
好吧,我的计划是制作一个程序来识别推文中的关键字并在 tkinter 中显示推文。本质上,每次推文被识别时,我都希望它更新 tkinter 中的标签。
我确实知道如何使用 Twython 实现流来执行此操作,但我的问题是我无法同时拥有流和 tkinter 运行。我考虑过线程化,我尝试过,但我没有线程化经验,可能做错了。
这只是我制作更复杂的东西的垫脚石类型的项目,但这很可能是无关紧要的。有人可以指出我正确的方向吗?这是我的代码:
from tkinter import *
from threading import Thread
from twython import Twython
from twython import TwythonStreamer
import time
APP_KEY = 'X'
APP_SECRET = 'X'
OAUTH_TOKEN = 'X'
OAUTH_TOKEN_SECRET = 'X'
TRACKING_TERM = 'something'
tweet_text = StringVar
WINDOW_SIZE_X = 1600
WINDOW_SIZE_Y = 300
WINDOW_SIZE_STRING = str(WINDOW_SIZE_X) + 'x' + str(WINDOW_SIZE_Y)
class Window(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.master = master
t = Thread(target=self.start_stream())
t.start()
self.init_window()
def init_window(self):
self.master.title('Twitter Streamer')
self.pack(fill=BOTH, expand=True)
self.label = Label(self, textvariable=tweet_text)
self.label.place(x=0, y=0)
def start_stream(self):
stream.statuses.filter(track=TRACKING_TERM)
# JWStreamer class is created to handle the streaming
class JWStreamer(TwythonStreamer):
def on_success(self, data):
if 'text' in data:
tweet_text = data['text'].encode('utf-8')
def on_error(self, status_code, data):
print('Error:', status_code)
# To disconnect on error uncomment the next line
# self.disconnect()
print('Waiting 60 seconds to reconnect...')
time.sleep(60)
# Twitter Object
twitter = Twython(APP_KEY,
APP_SECRET,
OAUTH_TOKEN,
OAUTH_TOKEN_SECRET)
# Steamer Object
stream = JWStreamer(APP_KEY,
APP_SECRET,
OAUTH_TOKEN,
OAUTH_TOKEN_SECRET)
root = Tk()
root.geometry(WINDOW_SIZE_STRING)
app = Window(root)
root.mainloop()
如果我的代码现在看起来有些草率,我深表歉意。你现在看到的是令人沮丧地四处移动东西只是为了让一些东西工作的结果。
这可能是一种低质量的解决方法,但我很确定它已被普遍接受。在 root
上使用 after()
方法。
我没用过,但我知道它可以让你在一段时间后调用一个函数。这是 link 到 docs and some questions。
你得去看看它,因为就像我说的,我以前没有用过它,但认为它可能对你有帮助。