Как я могу запустить что-то, что постоянно зацикливается вместе с 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()

Прошу прощения, если мой код сейчас кажется небрежным. То, что вы видите прямо сейчас, является результатом разочаровывающего перемещения вещей только для того, чтобы заставить что-то работать.


person Jeremy Warren    schedule 13.04.2015    source источник


Ответы (1)


Это может быть немного некачественной работой, но я совершенно уверен, что это общепринято. Используйте метод after() на root.

Я не использовал его, но я понимаю, что он позволяет вам вызывать функцию через некоторое время. Вот ссылка на документы и некоторые вопросы.

Вам придется искать в нем, потому что, как я уже сказал, я не использовал его раньше, но думаю, что это может быть полезно для вас.

person Zizouz212    schedule 13.04.2015
comment
Я видел этот первый вопрос, но стример — это не просто то, что я могу просто закрыть и перезапустить снова и снова. Хотя это было очень полезно. - person Jeremy Warren; 13.04.2015
comment
Отлично. Рад, что смог помочь! :) - person Zizouz212; 13.04.2015