Pulled tweet data into a separate class, added reply and retweet buttons that don't work quite yet
This commit is contained in:
parent
30f94e52c6
commit
8021d05ade
136
mytwitter.py
136
mytwitter.py
|
@ -2,7 +2,7 @@
|
||||||
#
|
#
|
||||||
# Custom twitter client... mostly for learning Python
|
# Custom twitter client... mostly for learning Python
|
||||||
|
|
||||||
import sys, twitter, ConfigParser, os, datetime, dateutil.tz, gtk, gtk.glade, gobject
|
import sys, twitter, ConfigParser, os, datetime, dateutil.tz, gtk, gtk.glade, gobject, re
|
||||||
|
|
||||||
|
|
||||||
class MyTwitter():
|
class MyTwitter():
|
||||||
|
@ -23,9 +23,9 @@ class MyTwitter():
|
||||||
if self.refresh_time < 10:
|
if self.refresh_time < 10:
|
||||||
self.refresh_time = 10
|
self.refresh_time = 10
|
||||||
|
|
||||||
self.labels = []
|
self.tweets = []
|
||||||
self.texts = []
|
|
||||||
self.list = None
|
self.list = None
|
||||||
|
self.reply_id = None
|
||||||
|
|
||||||
# Authenticate with twitter, set up the API object
|
# Authenticate with twitter, set up the API object
|
||||||
self.api = twitter.Api(username=self.username, password=self.password)
|
self.api = twitter.Api(username=self.username, password=self.password)
|
||||||
|
@ -48,26 +48,10 @@ class MyTwitter():
|
||||||
|
|
||||||
# Build us some labels...
|
# Build us some labels...
|
||||||
for i in range(0, self.num_entries):
|
for i in range(0, self.num_entries):
|
||||||
## Build the header
|
self.tweets.append(TweetBox())
|
||||||
self.labels.append(gtk.Label())
|
self.tweet_box.pack_start(self.tweets[i])
|
||||||
label_eb = gtk.EventBox()
|
self.tweets[i].reply_button.connect('clicked', self.on_reply)
|
||||||
label_eb.add(self.labels[i])
|
self.tweets[i].retweet_button.connect('clicked', self.on_retweet)
|
||||||
label_eb.modify_text(gtk.STATE_NORMAL,gtk.gdk.color_parse("#ffffff"))
|
|
||||||
label_eb.modify_bg(gtk.STATE_NORMAL,gtk.gdk.color_parse("#8888ff"))
|
|
||||||
self.tweet_box.pack_start(label_eb)
|
|
||||||
self.labels[i].set_alignment(0.0, 0.0)
|
|
||||||
self.labels[i].set_selectable(True)
|
|
||||||
self.labels[i].set_line_wrap(True)
|
|
||||||
## Build the text
|
|
||||||
self.texts.append(gtk.Label())
|
|
||||||
text_align = gtk.Alignment()
|
|
||||||
text_align.set_padding(2, 10, 3, 0)
|
|
||||||
text_align.add(self.texts[i])
|
|
||||||
self.tweet_box.pack_start(text_align)
|
|
||||||
self.texts[i].set_alignment(0.0, 0.0)
|
|
||||||
self.texts[i].set_selectable(True)
|
|
||||||
self.texts[i].set_line_wrap(True)
|
|
||||||
|
|
||||||
self.tweet_box.show_all()
|
self.tweet_box.show_all()
|
||||||
|
|
||||||
# Fill the ComboBox with entries
|
# Fill the ComboBox with entries
|
||||||
|
@ -82,9 +66,6 @@ class MyTwitter():
|
||||||
|
|
||||||
|
|
||||||
def update_window(self):
|
def update_window(self):
|
||||||
timezone = dateutil.tz.gettz()
|
|
||||||
time_format = "%Y.%m.%d %H:%M:%S %Z"
|
|
||||||
|
|
||||||
if self.list is None or self.list == 'Home':
|
if self.list is None or self.list == 'Home':
|
||||||
statuses = self.api.GetFriendsTimeline(self.username, count=self.num_entries)
|
statuses = self.api.GetFriendsTimeline(self.username, count=self.num_entries)
|
||||||
elif self.list == '@' + self.username:
|
elif self.list == '@' + self.username:
|
||||||
|
@ -94,18 +75,7 @@ class MyTwitter():
|
||||||
|
|
||||||
for i in range(0, self.num_entries):
|
for i in range(0, self.num_entries):
|
||||||
if i < len(statuses):
|
if i < len(statuses):
|
||||||
# Update the label with the user's name and screen name
|
self.tweets[i].set_status(statuses[i])
|
||||||
user = statuses[i].user
|
|
||||||
|
|
||||||
timestamp = datetime.datetime.strptime(statuses[i].created_at, "%a %b %d %H:%M:%S +0000 %Y")
|
|
||||||
timestamp = timestamp.replace(tzinfo=dateutil.tz.gettz('UTC'))
|
|
||||||
timestring = timestamp.astimezone(timezone).strftime(time_format)
|
|
||||||
|
|
||||||
labeltext = user.name + " (" + user.screen_name + ") " + timestring
|
|
||||||
self.labels[i].set_markup(labeltext)
|
|
||||||
|
|
||||||
# Display the text of the tweet
|
|
||||||
self.texts[i].set_markup(statuses[i].text)
|
|
||||||
|
|
||||||
|
|
||||||
def update_window_callback(self, widget):
|
def update_window_callback(self, widget):
|
||||||
|
@ -140,7 +110,95 @@ class MyTwitter():
|
||||||
self.list = widget.get_active_text()
|
self.list = widget.get_active_text()
|
||||||
self.update_window()
|
self.update_window()
|
||||||
|
|
||||||
### end class TwitWindow
|
|
||||||
|
# fixme: these are stubs
|
||||||
|
def on_reply(self, reply):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def on_retweet(self, retweet):
|
||||||
|
pass
|
||||||
|
|
||||||
|
### end class MyTwitter
|
||||||
|
|
||||||
|
|
||||||
|
class TweetBox(gtk.VBox):
|
||||||
|
|
||||||
|
'''
|
||||||
|
GUI for displaying one tweet and associated buttons
|
||||||
|
|
||||||
|
Also stores the data necessary for replying or retweeting (id, screen name)
|
||||||
|
'''
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
gtk.VBox.__init__(self)
|
||||||
|
|
||||||
|
self.screen_name = None
|
||||||
|
self.id = None
|
||||||
|
|
||||||
|
self.init_widgets()
|
||||||
|
|
||||||
|
|
||||||
|
def init_widgets(self):
|
||||||
|
## Build the header
|
||||||
|
self.header = gtk.Label()
|
||||||
|
label_eb = gtk.EventBox()
|
||||||
|
label_eb.add(self.header)
|
||||||
|
self.pack_start(label_eb)
|
||||||
|
|
||||||
|
# Set the header's properties
|
||||||
|
label_eb.modify_text(gtk.STATE_NORMAL,gtk.gdk.color_parse("#ffffff"))
|
||||||
|
label_eb.modify_bg(gtk.STATE_NORMAL,gtk.gdk.color_parse("#8888ff"))
|
||||||
|
self.header.set_alignment(0.0, 0.0)
|
||||||
|
self.header.set_selectable(True)
|
||||||
|
self.header.set_line_wrap(True)
|
||||||
|
|
||||||
|
## Build the text
|
||||||
|
self.text = gtk.Label()
|
||||||
|
text_align = gtk.Alignment()
|
||||||
|
text_align.add(self.text)
|
||||||
|
self.pack_start(text_align)
|
||||||
|
|
||||||
|
# Set the text's properties
|
||||||
|
text_align.set_padding(2, 10, 3, 0)
|
||||||
|
self.text.set_alignment(0.0, 0.0)
|
||||||
|
self.text.set_selectable(True)
|
||||||
|
self.text.set_line_wrap(True)
|
||||||
|
|
||||||
|
button_box = gtk.HBox()
|
||||||
|
self.pack_start(button_box)
|
||||||
|
|
||||||
|
self.reply_button = gtk.Button("Reply")
|
||||||
|
button_box.pack_start(self.reply_button, expand=False)
|
||||||
|
self.retweet_button = gtk.Button("Retweet")
|
||||||
|
button_box.pack_start(self.retweet_button, expand=False)
|
||||||
|
# the parent object will bind reply and retweet
|
||||||
|
|
||||||
|
|
||||||
|
def set_status(self, status):
|
||||||
|
timezone = dateutil.tz.gettz()
|
||||||
|
time_format = "%Y.%m.%d %H:%M:%S %Z"
|
||||||
|
|
||||||
|
# Get the user object
|
||||||
|
user = status.user
|
||||||
|
|
||||||
|
# Get user's data for retweeting / replying
|
||||||
|
self.screen_name = user.screen_name
|
||||||
|
self.id = status.id
|
||||||
|
|
||||||
|
# ... and a formatted timestamp
|
||||||
|
timestamp = datetime.datetime.strptime(status.created_at, "%a %b %d %H:%M:%S +0000 %Y")
|
||||||
|
timestamp = timestamp.replace(tzinfo=dateutil.tz.gettz('UTC'))
|
||||||
|
timestring = timestamp.astimezone(timezone).strftime(time_format)
|
||||||
|
|
||||||
|
# Set the header
|
||||||
|
self.header.set_markup(user.name + " (" + user.screen_name + ") " + timestring)
|
||||||
|
|
||||||
|
# and the text
|
||||||
|
self.text.set_markup(status.text)
|
||||||
|
|
||||||
|
# end class TweetBox
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# main
|
# main
|
||||||
|
|
Reference in New Issue
Block a user